回调,swift

时间:2015-07-01 05:19:13

标签: ios swift

我在地图中的几个地方反转了地理编码,我想把它包装成一些常用的方法。我所拥有的是一个有效的起点:

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark) -> Void) {
    let geocoder = CLGeocoder()

    geocoder.reverseGeocodeLocation(location) {
        (placemarks, error) -> Void in

        // Check for returned placemarks
        if let placemarks = placemarks where placemarks.count > 0 {
            let topResult = placemarks[0] as! CLPlacemark

            completion(topResult)
        }
    }
}

但是,如果我想在我的完成方法中添加另一个参数,它会将错误返回到我的视图,如下所示:

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark, NSError) -> Void) {
    let geocoder = CLGeocoder()

    geocoder.reverseGeocodeLocation(location) {
        (placemarks, error) -> Void in

        // Check for returned placemarks
        if let placemarks = placemarks where placemarks.count > 0 {
            let topResult = placemarks[0] as! CLPlacemark

            completion(topResult, error)
        }
    }
}

如果错误为nil,那么我的completion(topResult, error)将失败,因为错误访问时错误为零。但我不能这样做,因为参数与完成处理程序不匹配。

if error != nil {
    completion(topResult)
} else {
    completion(...) // do something with the error
}

所以如果我有一个nil错误,我怎么称呼我的完成处理程序?感谢。

1 个答案:

答案 0 :(得分:1)

由于您拥有完成标题的定义,您可以使用可选的NSError?正常定义它因此它不会导致错误并且需要展开。此外,最近CLGeocodeCompletionHandler的定义也使用了可选数组和错误:

typealias CLGeocodeCompletionHandler = ([CLPlacemark]?, NSError?) -> Void