我目前正在创建一个项目,我需要对地址进行地理编码并将其放入坐标中。正如你所看到的,我已经在下面做了以下功能来做到这一点,它的工作原理。但是,在此函数中返回的变量似乎不会在应用程序的其余部分更新。以下是我的代码。
var startLat: Double!
var startLong: Double!
typealias theDouble = (Double, Double) -> ()
func forwardGeocodingStarting(address: String, completion: theDouble){
//your code
let aVar: Double!
let bVar: Double!
let placemark = placemarks?[0]
let location = placemark?.location
let coordinate = location?.coordinate
aVar = (coordinate?.latitude)!
bVar = (coordinate?.longitude)!
completion(aVar, bVar)
}
// CALL THIS FUNCTION
forwardGeocodingStarting(<your string address>) { firstVar, secondVar in
startLat = firstVar
startLong = secondVar
print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES
}
print(startLat) // GET "NIL"
print(startLong) // GET "NIL"
// ================= EDIT ==============
if startLat != 0 {
let startLatUnwrapped: Double = startLat
}
if startLong != 0 {
let startLongUnwrapped: Double = startLong
}
我需要做的是使用startLat
&amp; startLong
在我的整个项目中,但似乎没有在我之外更新调用函数。当我在函数调用之外调用这两个变量时,它只返回nil
。非常感谢任何帮助。
答案 0 :(得分:0)
异步块立即返回控制。所以,当你打电话
print(startLat)
在异步块之后,它将不包含更新的值(在这种情况下,它包含nil)。我不建议在异步块之后立即使用变量,而是建议创建一个方法,对变量执行所需的工作,并在异步闭包结束时调用它。
另一种安全使用变量的方法是检查它们是否为零。你可以使用
if let
安全地展开变量。
希望这有帮助。
修改
这就是我的意思:
forwardGeocodingStarting(<your string address>) { firstVar, secondVar in
startLat = firstVar
startLong = secondVar
print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES
self.unwrapAndPrintCoordinates()
}
//Now, if anywhere in your code, you want to check if startLat and startLong
//have values, you call this method
func unwrapAndPrintCoordinates() {
//Unwrap startLat
if let startLatUnwrapped = startLat {
print(startLatUnwrapped)
}
//Unwrap startLong
if let startLongUnwrapped = startLong {
print(startLongUnwrapped)
}
}