gpt4 book ai didi

swift - 在swift中向闭包内的变量添加值

转载 作者:行者123 更新时间:2023-11-28 12:12:36 24 4
gpt4 key购买 nike

我是 swift 语言的新手,我遇到了无法解决的问题。

运行我的应用程序后,我得到空字符串的输出:nil

那么,我的问题是如何在闭包内为变量添加值

因为当我在闭包 print(self.latLong) 中添加行时,我得到了坐标输出,但我需要在变量中使用该值,因为我需要使用该变量稍后在我的代码中,我不想在该闭包中编写所有功能

这是我的代码:

import UIKit
import CoreLocation
import Firebase

var latLong: String!

override func viewDidLoad() {
super.viewDidLoad()

findCordiante(adress: "Cupertino, California, U.S.")
print(latLong)
}

func findCordiante(adress:String){

let geocoder = CLGeocoder()
geocoder.geocodeAddressString(adress) {
placemarks, error in

if (placemarks != nil){
let placemark = placemarks?.first
let lat = placemark?.location?.coordinate.latitude
let lon = placemark?.location?.coordinate.longitude

self.latLong = String(describing: lat!) + "," + String(describing: lon!)

}else{
//handle no adress
self.latLong = ""
}
}

}

最佳答案

问题是 geocodeAddressString 是异步运行的(也就是说,他们把它写成立即返回并稍后在请求完成时调用它的闭包需要很长时间),所以 viewDidLoad 正在打印 latLong 远早于此属性最终在 geocodeAddressString 完成处理程序闭包中设置。

解决方案是在您自己的代码中采用异步编程模式。例如,使用您自己的完成处理程序模式:

override func viewDidLoad() {
super.viewDidLoad()

findCordiante(adress: "Cupertino, California, U.S.") { string in
// use `string` here ...

if let string = string {
self.latLong = string
print(string)
} else {
print("not found")
}
}

// ... but not here, because the above runs asynchronously and it has not yet been set
}

func findCordiante(adress:String, completionHandler: @escaping (String?) -> Void) {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(adress) { placemarks, error in
if let location = placemarks?.first?.location, location.horizontalAccuracy >= 0 {
completionHandler("\(location.coordinate.latitude), \(location.coordinate.longitude)")
} else {
completionHandler(nil)
}
}
}

关于swift - 在swift中向闭包内的变量添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47960268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com