如何在 swift 4 的闭包中分配类属性

Posted

技术标签:

【中文标题】如何在 swift 4 的闭包中分配类属性【英文标题】:How do I assign a class property within a closure in swift 4 【发布时间】:2019-03-03 15:41:12 【问题描述】:

我正在尝试访问位置数据,从中获取城市名称,然后将其分配给一个变量,以便我可以在其他地方使用它。它从闭包内打印出变量很好,但是当我尝试通过我创建的类变量访问它时它为零,代码如下,谢谢。

class NewPostViewController: BaseViewController 

    @IBOutlet weak var postBodyTextField: UITextField!

    var city: String?

    @IBAction func createPostAction(_ sender: Any) 
        getCity()

        db.collection("posts").document().setData([
            "body": postBodyTextField.text,
            "location": city,
            "user": user?.displayName
        ])  err in
            if let err = err 
                print("Error writing document: \(err)")
             else 
                print("Document successfully written!")
            
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

    func getCity() 
        Locator.currentPosition(accuracy: .city, onSuccess:  location in
            let geocoder: CLGeocoder = CLGeocoder()
            geocoder.reverseGeocodeLocation(location, completionHandler:  location, error in
                if let location = location 
                    self.city = location[0].locality
                
            )
        , onFail: _,_ in
            print("Error, couldnt get current location")
        )
    

【问题讨论】:

想想/谷歌什么是“异步”。您的代码未按编写顺序运行。您正在分配 to self.city 您尝试从 self.city 获取值。 "location": city self.city = location[0].locality 行之前执行。 【参考方案1】:

db.collection("posts").document().setData 调用移动到 reverseGeocode 闭包中:

geocoder.reverseGeocodeLocation(location, completionHandler:  location, error in
    if let location = location 
         self.city = location[0].locality
         db.collection("posts").document().setData( .... )
    
)

【讨论】:

以上是关于如何在 swift 4 的闭包中分配类属性的主要内容,如果未能解决你的问题,请参考以下文章

防止在 iOS 中分配类

如何在 C++ 中分配类内数组的可修改大小

在 Python 中分配类布尔值

C ++从不同的函数中分配类成员的值

如何在 Swift 中将计算的闭包属性转换为闭包?

Swift 中的可选闭包属性