所以我的问题是这样的:
我正在尝试实现对CLGeoCoder的扩展,以便能够从CLLocation获取城市名称,但是当我尝试在reverseGeocodeLocation的完成处理程序中设置输入城市名称字符串时,我遇到了一个问题

这是我的扩展代码:

extension CLGeocoder {

  func findCityName(location:CLLocation, inout cityName:String) -> Void{
      self.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in

        // Place details
        var placeMark: CLPlacemark!
        placeMark = placemarks?[0]

        // Address dictionary
        print(placeMark.addressDictionary)



        // City
        if let city = placeMark.addressDictionary!["City"] as? String {
            cityName = city
        }
      })
  }
}


此扩展的目标是能够通过引用此函数将其设置为带有城市名称的字符串。

一个例子是:

var cityName = ""
let location:CLLocation(latitude: 1, longitude: 1)
let geocoder: CLGeocoder()
geocoder.findCityName(location, &cityName)

///Later on in the process I would want to be able to use cityName for different purposes in my code


我面临的问题是,在completionHandler中设置cityName引用后,cityName的值在completionhandler之外保持为空。

我是新手,所以我可能错过了一些指针或如何使用它们的知识,但是我了解到inout可以从函数或闭包/补全处理程序内部更改变量的值。

预先感谢您为我提供的有关此问题的任何信息。

马丁

最佳答案

在findCityName函数退出时,cityName变量尚未更改。 reverseGeocodeLocation的完成处理程序最终将更新一个变量,该变量是原始cityName的副本,而不是您最初传递给该函数的变量。完成处理程序不会立即执行:它们会执行。如果它们将立即执行,则函数可以仅返回其结果,而不是使用完成处理程序,对吗?

现在,我同意你的看法,这很奇怪。但是奇怪的是,Swift不会更新您的inout变量。奇怪的是,Swift允许该程序进行编译。因为它没有意义。跟着我:

想象一下以下功能:

func f() {
    var cityName: String = ""
    findCityName(location, &cityName)
}


调用它时,最终执行reverseGeocodeLocation的完成处理程序时,传入的cityName变量将不存在。 f()函数早已退出,并且局部变量cityName消失了。

得到它了?甚至希望可以更新inout变量是没有意义的。

所以。现在,您必须重构代码。也许使用完成处理程序。

10-04 14:23