Как установить свойство класса с помощью мутирующей функции?

Следующий класс предоставляет мутирующую функцию для изменения своего свойства:

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:

Другие вопросы по тегам