Swift 即使在if状态中运行,变量也不会发生变化 导入UIKit 进口火基 类排行榜ViewController:UIViewController{ 结构人{ 变量placePoints:Int 变量名称:字符串 } var firstPlace=Person(地点:2,地名:) var secondPlace=Person(地点:1,地名:) var thirdPlace=Person(地点:1,地名:) var检查=0 var uid=“” var uniqueNumber:Int? var documentdata:[字符串:任意]=[”“:”“] @IBVAR firstPlaceLabel:UILabel! @IBOutlet弱var secondPlaceLabel:UILabel! @IBVAR thirdPlaceLabel:UILabel! @IBOutlet弱var重载标签:UILabel! 重写func viewDidLoad(){ super.viewDidLoad() CreateLeadboard() //加载视图后执行任何其他设置。 } func CreateLeadboard(){ 设db=Firestore.Firestore() db.collection(“users”).document(“0UniqueNumber”).getDocument{(document,error)在 印刷品(“小麦他”) 如果错误!=nil{ 打印(“无法获取数据”) } 如果document!=nil&&document!。存在{ 打印(“在这里”) 如果让documentdata=document?.data(){ self.uniqueNumber=documentdata[“tally”]作为?Int 打印(self.uniqueNumber) 打印(“FDSFSFSF”) self.rat() } } } } func rat(){ //var firstPlacePoints:Int? //var firstPlaceName:String? //var secondPlacePoints:Int? //var secondPlaceName:String? //第三个地点:Int? //var thirdPlaceName:字符串? 设db=Firestore.Firestore() 对于0中的索引…self.uniqueNumber!-1{ 让indexString=String(索引) db.collection(“排行榜”).document(indexString).getDocument{(document,error)在 如果错误!=nil{ 打印(“无法获取数据”) } 如果document!=nil&&document!。存在{ 如果让documentdata=document?.data(){ self.check=documentdata[“points”]as!Int self.uid=documentdata[“uid”]作为!字符串 打印(“AHWEHFESFHSADFSFDSDFSDFSDF”) if(self.check>self.firstPlace.placePoints){ self.secondPlace.placePoints=self.firstPlace.placePoints self.secondPlace.placeNames=self.firstPlace.placeNames self.firstPlace.placePoints=自检 self.firstPlace.placeNames=self.uid 打印(“hi”) }else if(self.check

Swift 即使在if状态中运行,变量也不会发生变化 导入UIKit 进口火基 类排行榜ViewController:UIViewController{ 结构人{ 变量placePoints:Int 变量名称:字符串 } var firstPlace=Person(地点:2,地名:) var secondPlace=Person(地点:1,地名:) var thirdPlace=Person(地点:1,地名:) var检查=0 var uid=“” var uniqueNumber:Int? var documentdata:[字符串:任意]=[”“:”“] @IBVAR firstPlaceLabel:UILabel! @IBOutlet弱var secondPlaceLabel:UILabel! @IBVAR thirdPlaceLabel:UILabel! @IBOutlet弱var重载标签:UILabel! 重写func viewDidLoad(){ super.viewDidLoad() CreateLeadboard() //加载视图后执行任何其他设置。 } func CreateLeadboard(){ 设db=Firestore.Firestore() db.collection(“users”).document(“0UniqueNumber”).getDocument{(document,error)在 印刷品(“小麦他”) 如果错误!=nil{ 打印(“无法获取数据”) } 如果document!=nil&&document!。存在{ 打印(“在这里”) 如果让documentdata=document?.data(){ self.uniqueNumber=documentdata[“tally”]作为?Int 打印(self.uniqueNumber) 打印(“FDSFSFSF”) self.rat() } } } } func rat(){ //var firstPlacePoints:Int? //var firstPlaceName:String? //var secondPlacePoints:Int? //var secondPlaceName:String? //第三个地点:Int? //var thirdPlaceName:字符串? 设db=Firestore.Firestore() 对于0中的索引…self.uniqueNumber!-1{ 让indexString=String(索引) db.collection(“排行榜”).document(indexString).getDocument{(document,error)在 如果错误!=nil{ 打印(“无法获取数据”) } 如果document!=nil&&document!。存在{ 如果让documentdata=document?.data(){ self.check=documentdata[“points”]as!Int self.uid=documentdata[“uid”]作为!字符串 打印(“AHWEHFESFHSADFSFDSDFSDFSDF”) if(self.check>self.firstPlace.placePoints){ self.secondPlace.placePoints=self.firstPlace.placePoints self.secondPlace.placeNames=self.firstPlace.placeNames self.firstPlace.placePoints=自检 self.firstPlace.placeNames=self.uid 打印(“hi”) }else if(self.check,swift,xcode,Swift,Xcode,最后,当我打印self.firstPlace.placePoints时,它会在初始化时打印原始值。它改变了if语句中的值,我用print语句检查它。但是,正如我在运行print语句时所说,它不会更新。这与局部变量有关吗?谢谢您的帮助。问题是您正在运行一个循环并调用一个异步方法。您的循环很可能在异步方法完成之前完成。您应该等到异步方法完成后再调用它。这样做可能会: import UIKit import Firebase class LeaderBoardViewController: UIVie

最后,当我打印self.firstPlace.placePoints时,它会在初始化时打印原始值。它改变了if语句中的值,我用print语句检查它。但是,正如我在运行print语句时所说,它不会更新。这与局部变量有关吗?谢谢您的帮助。

问题是您正在运行一个循环并调用一个异步方法。您的循环很可能在异步方法完成之前完成。您应该等到异步方法完成后再调用它。这样做可能会:

import UIKit
import Firebase
class LeaderBoardViewController: UIViewController {
    struct Person{
        var placePoints:Int
        var placeNames:String
    }
    var firstPlace = Person(placePoints:2,placeNames:"")
    var secondPlace = Person(placePoints:1,placeNames:"")
    var thirdPlace = Person(placePoints:1,placeNames:"")
    var check = 0
    var uid = ""
    var uniqueNumber:Int?
    var documentdata:[String:Any] = ["":""]
    @IBOutlet weak var firstPlaceLabel: UILabel!

    @IBOutlet weak var secondPlaceLabel: UILabel!

    @IBOutlet weak var thirdPlaceLabel: UILabel!

    @IBOutlet weak var reloadLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        createLeaderboard()

        // Do any additional setup after loading the view.
    }

    func createLeaderboard(){
        let db = Firestore.firestore()
        db.collection("users").document("0UniqueNumber").getDocument { (document,error) in
            print("wheat the he")
            if error != nil{
                print("cant get data")

            }
            if document != nil && document!.exists{
                print("its here")
                if let documentdata = document?.data() {
                    self.uniqueNumber = documentdata["tally"] as? Int
                    print(self.uniqueNumber)
                    print("FDSFSF")
                    self.rat()
                }
            }
        }
    }
    func rat(){
        //var firstPlacePoints:Int?
        //var firstPlaceName:String?
        //var secondPlacePoints:Int?
        //var secondPlaceName:String?
        //var thirdPlacePoints:Int?
        //var thirdPlaceName:String?

        let db = Firestore.firestore()
        for index in 0...self.uniqueNumber!-1{
            let indexString = String(index)
            db.collection("leaderboard").document(indexString).getDocument { (document,error) in

                if error != nil{
                    print("cant get data")

                }
                if document != nil && document!.exists{

                    if let documentdata = document?.data() {
                        self.check = documentdata["points"] as! Int
                        self.uid = documentdata["uid"] as! String
                        print("ahwehfesfhsadfsfdsdfsdfsdfsdf")
                        if (self.check > self.firstPlace.placePoints){
                            self.secondPlace.placePoints = self.firstPlace.placePoints
                            self.secondPlace.placeNames = self.firstPlace.placeNames
                            self.firstPlace.placePoints = self.check
                            self.firstPlace.placeNames = self.uid

                            print("hi")
                        }else if(self.check < self.firstPlace.placePoints && self.secondPlace.placePoints < self.check){
                            self.thirdPlace.placePoints = self.secondPlace.placePoints
                            self.thirdPlace.placeNames = self.secondPlace.placeNames
                            self.secondPlace.placePoints = self.check
                            self.secondPlace.placeNames = self.uid

                        }else if(self.check < self.secondPlace.placePoints && self.thirdPlace.placePoints < self.check){
                            self.thirdPlace.placePoints = self.check
                            self.thirdPlace.placeNames = self.uid
                        }
                    }
                }
            }

            //setGuys()

        }
        print(self.firstPlace.placePoints)
    }
}

func创建排行榜(){
设db=Firestore.Firestore()
db.collection(“users”).document(“0UniqueNumber”).getDocument{document,出现错误
guard let document=文档,
让documentData=document.data(),
将tally=documentData[“tally”]设为?Int,
文件存在,
错误==无其他错误{
打印(“失败”)
返回
}
自身大鼠(指数:0,计数:计数)
}
}
func rat(索引:Int,计数:Int){
防护指数<其他{
返回
}
让indexString=String(索引)
设db=Firestore.Firestore()
db.collection(“排行榜”).document(indexString).getDocument{document,出现错误
guard let document=文档,
让documentData=document.data(),
文件存在,
错误==无其他错误{
打印(“失败”)
返回
}
guard let check=documentData[“points”]as?Int,
让uid=documentData[“uid”]作为字符串else{
打印(“缺失数据”)
返回
}
// ...
//做你在这里必须做的任何事情
// ...
//现在你准备好打下一个电话了
自身老鼠(指数:指数+1,计数:计数)
}
}

否。之所以会发生这种情况,是因为您的代码是异步的,所以首先打印
self.firstPlace.placePoints
,然后更改它。请阅读,我明白了,我应该把它放在哪里,这样它只能运行一次?我可以把那个语句放在哪里,这样它就能自我修复?
func createLeaderboard() {
    let db = Firestore.firestore()
    db.collection("users").document("0UniqueNumber").getDocument { document, error in
        guard let document = document,
            let documentData = document.data(),
            let tally = documentData["tally"] as? Int,
                document.exists,
                error == nil else {
                    print("Failed")
                    return
            }
        self.rat(index: 0, tally: tally)
    }
}

func rat(index: Int, tally: Int) {
    guard index < tally else {
        return
    }

    let indexString = String(index)
    let db = Firestore.firestore()
    db.collection("leaderboard").document(indexString).getDocument { document, error in
        guard let document = document,
            let documentData = document.data(),
            document.exists,
            error == nil else {
                print("Failed")
                return
        }

        guard let check = documentData["points"] as? Int,
            let uid = documentData["uid"] as? String else {
                print("Missing data")
                return
        }

        // ...
        // Do whatever else you have to do here
        // ...

        // Now you're ready make the next call
        self.rat(index: index + 1, tally: tally)
    }
}