我在地图中的几个地方反转了地理编码,我想把它包装成一些常用的方法。我所拥有的是一个有效的起点:
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错误,我怎么称呼我的完成处理程序?感谢。
答案 0 :(得分:1)
由于您拥有完成标题的定义,您可以使用可选的NSError?
正常定义它因此它不会导致错误并且需要展开。此外,最近CLGeocodeCompletionHandler
的定义也使用了可选数组和错误:
typealias CLGeocodeCompletionHandler = ([CLPlacemark]?, NSError?) -> Void