我想用其他逻辑将geocoder.geocdeAddressString包装在另一个方法中。
public func placemarkForSearchResult<T>(searchResult: T) -> CLPlacemark? {
if let searchResult = searchResult as? String {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(searchResult, completionHandler: {
(placemarks, error) -> Void in
// Check for returned placemarks
if let placemarks = placemarks where placemarks.count > 0 {
return placemarks[0] as! CLPlacemark // CLPlacemark is not convertible to void error message
}
return nil // Typd Void does not conform to protocol NilLiteralConvertible
})
}
}
我在这个方法中有一些其他逻辑并不是真正相关,但我想知道如何处理这样的情况,我想返回一个CLPlacemark,但不能因为地理编码器的completionHandler返回Void。我无法更改地理编码器回调的Void参数。那可能吗?或者我是否一直在调用使用地理编码器中找到的CLPlacemark的委托方法?提前致谢。
答案 0 :(得分:6)
您永远不能从placemarkForSearchResult
函数返回地标,因为获取地标需要使用异步函数(geocodeAddressString
)。到那个时候该函数已经完成并回调到你的完成处理程序,你的placemarkForSearchResult
已经完成并且很久以前就已经返回了!
您需要一个与您正在调用的函数的异步特性兼容的策略。您需要placemarkForSearchResult
接受回调函数参数,而不是从placemarkForSearchResult
返回地标。当您在完成处理程序中有地标时,调用该回调函数。如果该回调函数(巧妙地)设计为接受地标参数,那么您现在将该地标交给任何一个打电话给您的人。