Как установить свойство класса с помощью мутирующей функции?
Следующий класс предоставляет мутирующую функцию для изменения своего свойства:
class Person {
struct Location {
var coordinate: CLLocationCoordinate2D!
var city: String?
mutating func setLocationNameFromCoordinate(completion:(()->())?) {
let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
CLGeocoder().reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: NSError?) in
guard let city = placemarks?.first?.locality where error == nil else {
return
}
self.city = city //1
completion?()
}
}
}
var location: Location?
}
Функция называется так:
person.location?.setLocationNameFromCoordinate() {
print(person.location?.city) //2
}
Тем не менее, в 1
название города задается, если смотреть на него изнутри структуры Struct, но на 2
название города не задано для объекта. Что я здесь не так делаю?
2 ответа
Вы можете изменить переменную вне структуры, но вы не можете изменить ее из ее собственных методов. Вы можете попробовать вот так.
class Person {
struct Location {
var coordinate: CLLocationCoordinate2D!
var city: String?
mutating func setLocationNameFromCoordinate(completion: (city: String) -> Void) {
let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
CLGeocoder().reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: NSError?) in
guard let city = placemarks?.first?.subLocality where error == nil else {
return
}
self.city = city //Breakpoint1
completion(city: city)
}
}
}
var location: Location?
}
Я пишу некоторые примеры кодов, я думаю, что они знакомы с вами, и я думаю, что это правильный результат.
Я передаю это местоположение самому себе с замыканием, и я проверил значение того же с a.location?.city
Изменить 1: