все, что вам нужно сделать, это переместить self.country = country
внутри обработчика завершения. Данные возвращаются асинхронно, которые вы можете увидеть довольно хорошо, если вы установить точки останова на country = placeholder
и self.country
линий
Вы должны помнить, что при определении экземпляра Place
в главном View Controller, значение place.country
будет первоначально не определены. Вы можете проверить его снова после задержки, чтобы получить обновленную версию, или вы можете добавить делегата, так что он обновляет родительский контроллер, когда значение готов
вот простая версия
class Place {
let location: CLLocation
var country: String = "Undefined"
init(location: CLLocation) {
self.location = location
CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (placemarks, _) in
self.country = placemarks![0].country! // I removed error and type checks for clarity
})
}
}
и вот более элегантный вариант с делегатами
protocol CountryUpdatedDelegate
{
func countryUpdated(_ country : String)
}
class Place {
let location: CLLocation
var country: String = "Undefined"
var delegate : CountryUpdatedDelegate!
init(location: CLLocation) {
self.location = location
CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (placemarks, _) in
guard let placeMarks = placemarks as [CLPlacemark]! else {
return
}
self.country = placemarks![0].country! // I removed error and type checks for clarity
self.delegate.countryUpdated(self.country)
})
}
}
, а затем в вашем ViewController
class ViewController: UIViewController, CountryUpdatedDelegate {
let place = Place(location: location!)
place.delegate = self
func countryUpdated(_ country : String)
{
print("Country has now been updated \(country)")
}
Не работает ... Я получаю либо «Не могу присвоить свойство:« страна »- это« пусть »постоянная». или «self», захваченное закрытием до того, как все члены были инициализированы « – lukas
, затем измените' let' на 'var' :-) – Russell
изменение let to var дает вторую ошибку:« self »захвачен закрытием перед всеми членами были инициализированы « – lukas