2016-03-08 18 views
1

我能够使用此功能正确地从Firebase中提取JSON数据。显示从Firebase中的JSON解析的数据。无法摆脱可选的字符串打印

func makeLeaderboard() { 
    let scoresRef = Firebase(url: "https://URL.firebaseio.com/High%20Scores") 

    scoresRef.observeEventType(.Value, withBlock: { snapshot in 
     var newItems = [LeaderboardItem]() 

     for item in snapshot.children { 
      let leaderboardItem = LeaderboardItem(snapshot: item as! FDataSnapshot) 
      newItems.append(leaderboardItem) 
      print(item) 
     } 
     self.leaderboardItems = newItems 
    }) 
} 

JSON数据有很多对象,看起来像这样:

Snap (-KCIjxAHgGrNnBbL7jsI) { 
    ".priority" = "-11"; 
    Date = "1457398993.668789"; 
    Name = brendan; 
    Score = 11; 
    UUID = "BD561F1C-72A8-4A01-A71A-850682E49D61"; 
} 
Snap (-KC3MktapH6Mebw2sAUe) { 
    ".priority" = "-10"; 
    Date = "1457140993.692581"; 
    Name = brendan; 
    Score = 10; 
    UUID = "BD561F1C-72A8-4A01-A71A-850682E49D61"; 
} etc etc etc 

我创建从这些快照leaderboardItem对象。这是基本结构:

import Foundation 
import Firebase 

struct LeaderboardItem { 

let key: String! 
var score: String! 
let name: String! 
let ref: Firebase? 


// Initialize from arbitrary data 
init(name: String, score: String, completed: Bool, key: String = "") { 
    self.key = key 
    self.name = name 
    self.score = score 

    self.ref = nil 
} 

init(snapshot: FDataSnapshot!) { 
    key = snapshot.key! 
    name = snapshot.value["Name"]! as! String! 
    score = String(snapshot.value["Score"]) //String(snapshot.value["Score"]!) 
    ref = snapshot.ref! 
} 

func toAnyObject() -> AnyObject { 
    return [ 
     "name": name, 
     "score": score, 
    ] 
    } 
} 

当我去尝试显示leaderboardItem数组对象的得分属性,显示为可选。无论我如何强制解包属性,它仍然显示可选项。

我使用此代码显示标签:

func populateLeaderBoard() { 

    leaderboardScore1.text = "\(leaderboardItems[0].score!) \(leaderboardItems[0].name)" 
    leaderboardScore2.text = "\(leaderboardItems[1].score) \(leaderboardItems[1].name)" 
    leaderboardScore3.text = "\(leaderboardItems[2].score) \(leaderboardItems[2].name)" 
    leaderboardScore4.text = "\(leaderboardItems[3].score) \(leaderboardItems[3].name)" 
    leaderboardScore5.text = "\(leaderboardItems[4].score) \(leaderboardItems[4].name)" 

} 

当我运行的代码,这是显示输出 enter image description here

+0

你需要解开的值,例如, leaderboardItems [1] .score! –

+0

你能告诉我们如何填充你的'leaderboardItems'数组吗? – Chris

+0

穆罕默德,如果我这样做,没有什么变化。你可以看到我已经用leaderboardItems [0] .score做到了!并且我仍然在输出 – jakhamma

回答

-1

这似乎是有问题的行:

得分=字符串(snapshot.value [“分数”])

2

你需要解开可选值。你也可以做这样的事情:

if let score = leaderboardItems[0].score { 
    leaderboardScore1.text = String(format: "%zd", score) 
} 
+0

我认为你有格式的错字,但如果我运行它,我会显示2053561456而不是可选(11)brendan – jakhamma

+0

使用适当的格式说明符以获得正确的值。在我的例子中,我正在考虑成绩为Int。 –