0

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

这是我的扩展代码:

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 之外保持为空。

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

提前感谢您就我面临的这个问题提供的任何信息。

马丁

4

1 回答 1

0

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

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

想象一下下面的函数:

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

当你调用它时,你传入的 cityName 变量在 reverseGeocodeLocation的完成处理程序最终执行时不再存在。f() 函数早已退出,局部变量 cityName 已经不复存在。

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

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

于 2016-05-09T08:19:33.860 回答