在Swift中从callback中返回对象

我想用其他逻辑将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。 我无法更改地理编码器callback的Void参数。 那可能吗? 或者我坚持调用使用从地理编码器find的CLPlacemark的委托方法? 提前致谢。

您不能从geocodeAddressString函数返回地placemarkForSearchResult ,因为获取地标需要使用asynchronous函数( geocodeAddressString )。 到那个时候,这个函数已经完成并callback到你的完成处理程序,你的placemarkForSearchResult已经完成并返回很久了!

您需要一个兼容您正在调用的函数的asynchronous性质的策略。 而不是从placemarkForSearchResult返回地placemarkForSearchResult ,您需要placemarkForSearchResult 接受callback函数参数 。 当您在完成处理程序中具有地标时,可以调用该callback函数。 如果该callback函数(巧妙地)devise为接受地标参数 ,那么您现在将该地标交给了首先打给您的人。