以下代码无效。
func convertToStreet(location:CLLocationCoordinate2D) -> CLPlacemark {
var tempLocation = CLLocation(latitude: location.latitude, longitude: location.longitude)
var temPlacemark:CLPlacemark?
CLGeocoder().reverseGeocodeLocation(tempLocation, completionHandler: {(placemarks, error) in
temPlacemark = (placemarks[0] as CLPlacemark)
println(temPlacemark!.thoroughfare)
})
return temPlacemark!
}
完成处理程序内的Println工作正常,但代码末尾的temPlacemark值为nil。为什么会这样?我非常感谢你。
答案 0 :(得分:2)
这是因为completionHandler
是异步调用的。要实现这一点,您应该在自定义函数中有一个回调块,以便在从CLGeocoder
获取值后返回该值。
这样的事情:
func convertToStreet(coordinate: CLLocationCoordinate2D, completionHandler: (placemark: CLPlacemark!, error: NSError!) -> Void) {
let tempLocation = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
CLGeocoder().reverseGeocodeLocation(tempLocation) { placemarks, error in
completionHandler(placemark: placemarks?.first as CLPlacemark?, error: error)
}
}
然后你会这样称呼它:
convertToStreet(location.coordinate) { placemark, error in
if placemark != nil {
// use `placemark` here
println(placemark.thoroughfare)
} else {
println(error)
}
}
// but don't use `placemark` here
答案 1 :(得分:0)
您的代码的问题是块代码:
temPlacemark = (placemarks[0] as CLPlacemark)
println(temPlacemark!.thoroughfare)
将在稍后执行。
表示当前return
语句将始终返回未初始化的值。
如果您要在块中初始化此var
,则应将其设为对象的property
。