1

下面的类提供了一个变异函数来改变它的属性:

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为对象设置城市名称。我在这里做错了什么?

4

2 回答 2

1

您可以从结构外部更改 var,但不能从其自己的方法更改它。你可以这样试试。

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?
}
于 2016-08-25T12:10:24.487 回答
0

我写了一些示例代码,我认为它对你来说很熟悉,而且我认为它的结果是正确的。

在此处输入图像描述

我通过关闭将它自己传递出去的位置,我检查了它的值是否与a.location?.city

编辑1:

在此处输入图像描述

于 2016-08-25T13:04:36.270 回答