Return 来自扩展函数的值?

Return value from Extension Function?

我有一个问题,当我 select UITextField 时,会弹出一个视图控制器,用户可以在其中输入搜索栏并通过 Google 地点 API。它看起来像这样:

//When clicking on the UITextField, this function is called
@IBAction func selectLocation(){
    gpaViewController.placeDelegate = self
    presentViewController(gpaViewController, animated: true, completion: nil)
}

通过 GooglePlacesAutocomplete github 我在网上找到:https://github.com/watsonbox/ios_google_places_autocomplete 下面的扩展是为我写的,所以每次你 select 来自 UITableView 从呈现的 gpaViewController 中打印出 place.description 及其 details ,如下所示:

extension EventFormController: GooglePlacesAutocompleteDelegate {
    func placeSelected(place: Place){
        var test: Place?
        println(place.description)
        place.getDetails { details in
            println(details)
        }
    }

    func placeViewClosed() {
        dismissViewControllerAnimated(true, completion: nil)
    }
}

但是,这样做后,我想要它,这样我就可以 return 来自 placeSelected 函数的 place.description,如上所示,但我不太确定该怎么做所以。我试图在库中编辑 placeSelected 函数,但我认为您不能 return 来自 didSelectRowAtIndexPath UITableView 函数的任何内容。

public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  delegate?.placeSelected?(self.places[indexPath.row])
}

关于如何 return place.description 并将 place.description 设置为 select 选项后 UITextField 内的文本的任何想法?任何帮助将不胜感激!

func placeSelected(place: Place) 是一种协议方法,您不能通过添加 return 值来更改签名而不破坏回调链,即,如果您更改协议方法的签名,它不会被调用。您应该使用它来更新您的 UI,而不是从函数中返回 place.description,例如:

func placeSelected(place: Place){
    var test: Place?
    println(place.description)

    // update UI
    textField.text = place.description // assuming that your EventFormController has reference to the textField you're trying to access

    place.getDetails { details in
        println(details)
    }
}

不过,如果您能更具体地解释您想要实现的目标,那就更好了。我仍然不明白您的 placeSelected 和 didSelectRowAtIndexPath 实现之间的联系。

怎么样:

place.getDetails { details in
  self.textField.text = details.name
}

我没有通读文档,但我相信 getDetails 是一个类似于 getDetail(completionHandler: (Details) -> Void) 的函数,其中 completionHandler 是在获取详细信息后执行的闭包。

所以我猜你在获取数据后想要做的是让视图控制器中的 textField 显示获取的信息。