web-dev-qa-db-ja.com

Swift 3に更新した後、タイプ 'Any'には添え字メンバーがありません

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の構文ですが、これがコードの動作を停止させた理由がわかりません。

11
user6820041

FIRDataSnapshot では、valueid型です。

Swift では、idAnyとしてインポートされます。

Firebaseのドキュメントでは、valueにはNSDictionaryNSArrayNSNumber、またはNSStringのいずれかを指定できます。これらすべて、特にSwiftでは意味がありません。あなたの場合、それがNSDictionaryであることがわかっている場合、それをそれにキャストする必要があります。

8
J. Cocoe

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。

30
Aylii