所以我的问题是这样的: 我正在尝试实现 CLGeoCoder 的扩展,以便能够从 CLLocation 获取城市名称,但是当我尝试在verseGeocodeLocation 的完成处理程序中设置输入城市名称字符串时,我遇到了问题
这是我的扩展代码:
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 可以从函数或闭包/完成处理程序内部更改变量的值.
预先感谢您就我面临的这个问题向我提供的任何信息。
马丁
最佳答案
当 findCityName 函数退出时,cityName 变量尚未更改。 verseGeocodeLocation 的完成处理程序最终将更新一个变量,该变量是原始 cityName 的副本,而不是您最初传递给函数的变量。完成处理程序不会立即执行:它们将会执行。如果它们立即执行,函数可以只返回结果而不是使用完成处理程序,对吗?
现在,我同意你的观点,这很奇怪。但奇怪的并不是 Swift 不更新你的 inout 变量。奇怪的是 Swift 允许这个程序编译。因为它没有任何意义。关注我:
想象一下以下函数:
func f() {
var cityName: String = ""
findCityName(location, &cityName)
}
当您调用它时,当reverseGeocodeLocation 的完成处理程序最终执行时,您传入的cityName 变量将不再存在。 f()函数早已退出,局部变量cityName也消失了。
明白了吗?即使希望 inout 变量能够更新也是没有意义的。
所以。现在,您必须重构您的代码。也许使用完成处理程序。
关于ios - 如何在闭包内设置 Inout 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37100679/