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.
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.
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.