2016-12-09 15 views
2

私はFireBaseからユーザーをフェッチし、Dictionaryでそれらを変換し、この機能を持っている:スウィフトに辞書から値を取得する方法3

let leaderBoardDB = FIRDatabase.database().reference().child("scores1").queryOrderedByValue().queryLimited(toLast: 5) 
     leaderBoardDB.observe(.value, with: { (snapshot) in 
      print("scores scores", snapshot) 

      if let dictionary = snapshot.value as? [String: Any] { 
       for playa in dictionary { 
        let player = Player() 

        print("plaaaaayyyyyaaaaa", playa) 
        print("plaaaaayyyyyaaaaa key", playa.key) 
        print("plaaaaayyyyyaaaaa.value", playa.value) 
         player.id = playa.key 
        print(playa.key["name"]) 

       } 
      } 
      }, withCancel: nil) 
    } 

をし、私はこの結果を得る:

plaaaaayyyyyaaaaa ("inovoID", { name = Tatiana; points = 6; }) plaaaaayyyyyaaaaa key inovoID plaaaaayyyyyaaaaa.value { name = Tatiana; points = 6; } aaaa i id Optional("inovoID")

問題を私はユーザーの名前とポイントを取得できないということです。私はそれをしようとすると:

print(playa.key["name"]) 

それは私にこのエラーをgaves:

Cannot subscript a value of type 'String' with an index of type 'String'

は誰もが、これで私を助けてくださいことができますか?

+0

playa.objectForKey( "name")それは –

+0

で動作するはずです。それは言う:**タプルタイプの値 '(キー:文字列、値:任意)'メンバー 'objectForKey'を持っていない** –

答えて

2

あなたのJSONは

"inovoID" : { "name" : "Tatiana", "points" : 6 } 
  • playa.key"inovoID"
  • playa.valueですのでキーStringで、添字をすることはできません{ "name" : "Tatiana", "points" : 6 }

です。それがエラーの内容です。

を登録して、コンパイラを助けるために型を安全にキャストする必要があります。

if let person = playa.value as? [String:Any] { 
    print(person["name"] as! String) 
} 
+0

ありがとうございました。 –

3

私は、あなたが探していると思う:

player.name = dictionary["name"] as? String

あなたはそれが値ですアクセスするために辞書を反復処理する必要はありません。キーの価値を探しているなら、それを入手してください。

+0

私はプレーヤーの配列にプレーヤーを追加し、とスコア。 –

+0

iteratingしている辞書は、JSONオブジェクトです。項目の値をDictionaryに変換する必要があります。 – PeejWeej

+0

あなたのコメントを見ました。ありがとうございました! –

関連する問題