Доступ к информации из структуры - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь добавить аннотации к карте, но у меня возникают проблемы с доступом к различным переменным, хранящимся в моей структуре. Я хотел бы установить имя, широту и долготу для вывода элемента в переменных ресторанах. Однако при попытке реализовать широту, долготу и имя я получаю сообщения об ошибках. Как мне сделать это, чтобы я мог получить доступ к названию любого ресторана, широте и долготе внутри моей переменной.

Вот мой код.

import UIKit
import MapKit

struct PlacesOnMap {
var name: String
var latitude: Double
var longitude: Double

init(name: String, latitude: Double, longitude: Double) {
    self.name = name
    self.latitude = latitude
    self.longitude = longitude
}
}

class MapViewController: UIViewController {

var restaurants = [PlacesOnMap(name: "Pete's", latitude: -73.2455, longitude: 65.4443),
    PlacesOnMap(name: "Bake shop on 5th", latitude: 34.55555, longitude: 34.3333),
    PlacesOnMap(name: "Italian", latitude: -33.4444, longitude: 43.567)
]


@IBOutlet var mapView: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()

}


func setRestaurantsAnnotations() {
    let places = MKPointAnnotation()
    places.coordinate = CLLocationCoordinate2D(latitude: restaurants.latitude, longitude: restaurants.longitude) //I get the error: Value of type '[PlacesOnMap]' has no member 'latitude' or 'longitude'
    places.title = restaurants.name //I get the error: Value of type '[PlacesOnMap]' has no member 'name'
    mapView.addAnnotation(places)
}
}

1 Ответ

1 голос
/ 30 мая 2020

На самом деле это то, что вы хотите сделать:

restaurants.forEach { placeOnMap in
    let place = MKPointAnnotation()
    place.coordinate =  CLLocationCoordinate2D(latitude: placeOnMap.latitude, longitude: placeOnMap.longitude)
    place.title = placeOnMap.name
    mapView.addAnnotation(place)
}

Как упоминалось @matt в разделе комментариев, restaurant - это массив PlacesOnMap. Ваша цель - добавить эти места на карту, поэтому вам нужно преобразовать каждое из этих мест в экземпляр CLLocationCoordinate2D, а затем добавить его на карту.

В качестве альтернативы вы можете сделать это следующим образом:

let places = restaurants.map { placeOnMap -> MKPointAnnotation in
    let place = MKPointAnnotation()
    place.coordinate =  CLLocationCoordinate2D(latitude: placeOnMap.latitude, longitude: placeOnMap.longitude)
    place.title = placeOnMap.name
    return place
}
mapView.addAnnotations(places)

В этом примере вы отображаете массив ресторанов, который у вас есть, в массив из MKPointAnnotation экземпляров, а затем просто передаете этот массив в mapView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...