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
最后,当我打印self.firstPlace.placePoints时,它会在初始化时打印原始值。它改变了if语句中的值,我用print语句检查它。但是,正如我在运行print语句时所说,它不会更新。这与局部变量有关吗?谢谢您的帮助。问题是您正在运行一个循环并调用一个异步方法。您的循环很可能在异步方法完成之前完成。您应该等到异步方法完成后再调用它。这样做可能会: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
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)
}
}