Swiftでの私のコードは次のとおりです。
currentUserFirebaseReference.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
let UID = snapshot.key
let pictureURL = snapshot.value!["pictureURL"] as! String
let name = snapshot.value!["displayname"] as! String
let currentUser = Person(name: name, bio: "", UID: UID, pictureURL: pictureURL)
self.currentUserInfo = currentUser
})
Xcode 8/Swift 3にアップデートしたところ、次のエラーメッセージが表示されたようです。
「タイプ 'Any'には添え字メンバーがありません」
コードの多くの場所でsnapshot.value!["
ここに何かを挿入"]
と呼びますが、このエラーが発生し、コードを実行できません。
次のコードが機能します。
let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? ""
しかし、何が変わったのか、何がこれを必要とするのか、今まではどうだったのかわかりません。
私が知っている限り変更された唯一のことは、observeの構文ですが、これがコードの動作を停止させた理由がわかりません。
FIRDataSnapshot では、value
はid
型です。
Swift では、id
はAny
としてインポートされます。
Firebaseのドキュメントでは、value
にはNSDictionary
、NSArray
、NSNumber
、またはNSString
のいずれかを指定できます。これらすべて、特にSwiftでは意味がありません。あなたの場合、それがNSDictionary
であることがわかっている場合、それをそれにキャストする必要があります。
J. Cocoeの答えは絶対に正しいですが、コード例を必要とする人にとってはこれがあなたのやり方です:
の代わりに
let name = snapshot.value!["displayname"] as! String
試してみる
let snapshotValue = snapshot.value as? NSDictionary
let name = snapshotValue["displayName"] as? String
その考えは、snapshot.valueのタイプをAnyからNSDictionaryにキャストする必要があるということです。
編集:
Connorが指摘したように、snapshot.valueまたはバックエンドシステムからの何かを強制的にアンラップすることは、予期しない情報を受け取る可能性があるため、悪い考えです。だからあなたは変わります! NSDictionary to as? NSDictionary。