2017-02-01 27 views
0

我想喲訪問一個函數外的變量,我試圖聲明變量之外的類,但它始終顯示聲明中的初始值不是函數內的值,在這裏是我的代碼,我需要訪問databaseScore訪問一個函數外的變量 - swift

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 

} 
+0

@ EICaptainv2.0如果這是一個答案,請把它添加這樣 –

+3

這是著名的*異步陷阱*。從一個包含異步任務的方法返回某些東西是不可能的。 – vadian

+0

你可以請給你的問題添加更多的代碼。特別是顯示封閉對象,並且你調用'getDatabaseScore()' –

回答

1

正如評論這是不可能返回的東西形成含有異步任務的方法提及。

你需要一個完成的塊例如

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() { score in 
    guard let score = score else { return } 
    // do something with unwrapped "score" 
} 
+0

這給了我這個錯誤:致命錯誤:意外地發現零,同時展開一個可選值 –

+0

我添加的代碼不會崩潰,很可能崩潰發生在'讓ref2 ...'線。像封閉一樣使用可選的綁定來避免崩潰。 – vadian

+0

這裏的應用程序崩潰:self.getDatabaseScore(){得分 //如果得分,請用「得分」 做點事情! (self.scoreCounter) } } –

1

你做一個異步操作,之前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"] 
      } 
     } 
    } 
+0

databaseScore仍然保持0,它的聲明值爲 –

+0

也許'userDict [「score」]'包含0?嘗試在那裏添加一個'print'來確認 –

+0

不,它不是,我也是用它打印的 –