web-dev-qa-db-fra.com

Tapez 'Any' n'a aucun membre en indice après la mise à jour vers Swift 3

Voici mon code dans 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
            })

Je viens de mettre à jour vers Xcode 8/Swift 3, ce qui semble avoir provoqué le message d'erreur suivant:

"Le type 'Any' n'a aucun membre en indice"

J'appelle snapshot.value!["insérez quelque chose ici"] à plusieurs endroits de mon code, je reçois cette erreur et je ne peux pas exécuter mon code.

Le code suivant fonctionne:

let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? ""

Cependant, je ne vois pas ce qui a changé ou ce qui le rend nécessaire maintenant par rapport à ce qu'il était auparavant.

La seule chose qui a changé à ma connaissance est la syntaxe de l'observation, mais je ne comprends pas pourquoi cela a fait que mon code a cessé de fonctionner.

11
user6820041

Dans FIRDataSnapshot , value est de type id.

Dans Swift , id est importé en tant que Any.

Dans la documentation de Firebase, il est indiqué que value peut être n'importe lequel de NSDictionary, NSArray, NSNumber ou NSString - clairement, un indice n'a pas de sens sur tout cela, en particulier dans Swift. Si vous savez que c'est un NSDictionary dans votre cas, vous devez le convertir en cela.

8
J. Cocoe

La réponse de J. Cocoe est absolument correcte, mais pour ceux qui ont besoin d'un exemple de code, voici comment procéder:

au lieu de

let name = snapshot.value!["displayname"] as! String

essayer

let snapshotValue = snapshot.value as? NSDictionary
let name = snapshotValue["displayName"] as? String

L'idée est que vous devez convertir le type de snapshot.value de Any en NSDictionary.

Éditer:

Comme l'a souligné Connor, forcer le déballage de snapshot.value ou quoi que ce soit d'un système backend est une mauvaise idée en raison de la réception éventuelle d'informations inattendues. Alors tu changes comme! NSDictionnaire à as? NSDictionary.

30
Aylii