【问题标题】:Returning object from callback in Swift从 Swift 中的回调中返回对象
【发布时间】:2015-09-12 21:37:07
【问题描述】:

我想用其他逻辑将geocoder.geocodeAddressString 包装在另一个方法中。

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 的委托方法?

【问题讨论】:

    标签: ios swift core-location


    【解决方案1】:

    您永远无法从placemarkForSearchResult 函数返回地标,因为获取地标需要使用异步 函数 (geocodeAddressString)。到那时该函数已经完成并回调到您的完成处理程序中,您的 placemarkForSearchResult 已经完成并在很久以前返回了!

    您需要一种与您正在调用的函数的异步特性兼容的策略。您需要placemarkForSearchResult接受回调函数参数,而不是从placemarkForSearchResult 返回地标。当您在完成处理程序中有地标时,您调用该回调函数。如果该回调函数被(巧妙地)设计为接受地标参数,那么您现在将该地标交给首先打电话给您的人。

    【讨论】:

    • 并在此处查看我的答案:stackoverflow.com/a/30133533/341994 - 实际上,您的问题实际上是那个问题的重复。
    • “或者我坚持调用使用从地理编码器中找到的 CLPlacemark 的委托方法”是的,这是另一种可能的策略。它们几乎相同:在这两种方法中,您都建立了一条与调用者的通信线路,以便 可以在您自己的甜蜜异步时间内将地标发送回调用者。但是“接受回调函数”方法更轻量级和更灵活,因为不需要对调用方强加委托协议架构。
    • 只是一个后续 sn-p,如果我的完成看起来像:completion: (CLPlacemark) -&gt; Void,你如何将回调传递给原始的 placemarkForSearchResult 函数,因为我还没有实际的地标.假设它应该是addPlacemark(placemark: CLPlacemark),那么我如何将它作为回调传递?
    • 那么现在你是在扮演调用者的角色吗?你会通过addPlacemark。但是你更有可能传递一个匿名函数,即{ placemark in // ... code }。换句话说,您作为调用者调用placemarkForSearchResult 的方式就像您已经调用geocoder.geocodeAddressString 的方式一样。
    • 如果你不明白函数是如何在 Swift 中作为值传递的(虽然我很确定你确实理解它),请参阅我的书,从这里开始:apeth.com/swiftBook/ch02.html#_function_as_value
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2022-01-17
    相关资源
    最近更新 更多