访问函数外部的变量-swift

访问函数外部的变量-swift,swift,Swift,我试图在函数外访问变量,我试图在类外声明变量,但它一直在声明中显示初始值,而不是函数内的值,这是我的代码,我需要访问databaseScore func getDatabaseScore()-> Int{ let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!) ref2.observeSingleEvent(of: .childAdded,

我试图在函数外访问变量,我试图在类外声明变量,但它一直在声明中显示初始值,而不是函数内的值,这是我的代码,我需要访问databaseScore

func getDatabaseScore()-> Int{
    let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!)

    ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in
        if var userDict = snapshot.value as? [String:Int] {
            //Do not cast print it directly may be score is Int not string
            var databaseScore = userDict["score"]

        }


    })

    return databaseScore

}

您正在执行异步操作,因此
getDatabaseScore
observeSingleEvent
完成之前返回。你可以看看这样的东西

class MyClass {

    var databaseScore: Int = 0

    func getDatabaseScore() {

        let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!)

        ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in                 
            if let userDict = snapshot.value as? [String:Int] { 
                 print(userDict["score"]) // Confirm you have the a value
                 self.databaseScore = userDict["score"]
             }
         }
    }

您正在执行异步操作,因此
getDatabaseScore
observeSingleEvent
完成之前返回。你可以看看这样的东西

class MyClass {

    var databaseScore: Int = 0

    func getDatabaseScore() {

        let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!)

        ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in                 
            if let userDict = snapshot.value as? [String:Int] { 
                 print(userDict["score"]) // Confirm you have the a value
                 self.databaseScore = userDict["score"]
             }
         }
    }

正如注释中提到的,不可能从包含异步任务的方法返回某些内容

例如,您需要一个完成块

func getDatabaseScore(completion: (Int?)->()) {
    let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!)

    ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in
        if let userDict = snapshot.value as? [String:Int] {
            //Do not cast print it directly may be score is Int not string
            completion(userDict["score"])
        }
        completion(nil)
    })
}


正如注释中提到的,不可能从包含异步任务的方法返回某些内容

例如,您需要一个完成块

func getDatabaseScore(completion: (Int?)->()) {
    let ref2 = FIRDatabase.database().reference().child("users").child("user").child((user?.uid)!)

    ref2.observeSingleEvent(of: .childAdded, with: { (snapshot) in
        if let userDict = snapshot.value as? [String:Int] {
            //Do not cast print it directly may be score is Int not string
            completion(userDict["score"])
        }
        completion(nil)
    })
}



@如果这是一个答案,请将其添加为著名的异步陷阱。无法从包含异步任务的方法返回某些内容。请在问题中添加更多代码。特别是,显示封闭对象,以及调用
getDatabaseScore()
@EICaptainv2.0的位置。如果这是一个答案,请将其添加为著名的异步陷阱。无法从包含异步任务的方法返回某些内容。请在问题中添加更多代码。特别是,显示封闭对象,在调用
getDatabaseScore()
databaseScore的地方仍然保持0,其声明值可能
userDict[“score”]
包含0?尝试在其中添加一个
print
,以确认您的对象是结构还是类?您指的是哪个对象?databaseScore仍然保留0,其声明值可能
userDict[“score”]
包含0?尝试在其中添加一个
print
,以确认您的对象是结构还是类?您指的是哪个对象?这会导致以下错误:致命错误:在展开可选值时意外发现nil我添加的代码无法崩溃,崩溃很可能发生在
let ref2…
行中。使用诸如闭包中的可选绑定来避免崩溃。应用程序在此崩溃:self.getDatabaseScore(){score in//如果score!score是可选的,您必须检查它,我更新了答案。这给了我以下错误:致命错误:在展开可选值时意外发现nil我添加的代码无法崩溃,崩溃很可能发生在
let ref2…
行中。使用诸如闭包中的可选绑定来避免崩溃。应用程序在此崩溃:self.getDatabaseScore(){score in//如果score!分数是可选的,你要检查一下,我更新了答案。