web-dev-qa-db-fra.com

erreur fatale: l'élément NSArray n'a pas pu correspondre au type d'élément de tableau Swift

Tout à coup, j'ai commencé à obtenir une erreur d'exécution,

fatal error: NSArray element failed to match the Swift Array Element type

J'ai déclaré mon tableau comme,

var myArray : [CUSTOM_CLASS] = [CUSTOM_CLASS]()

Maintenant, dans mon bloc de réussite de réponse du serveur que j'ai,

self.myArray = dicResponse["data"]! as Array

println(self.myArray) // FATAL ERROR HERE

Qui fonctionnait parfaitement avant la mise à niveau vers Xcode6 Beta6

FYI : dicResponse["data"]! // is verified as valid

(Désolé de pointer au mauvais endroit avant!)

RESOLU:

Je ne sais pas mais j'avais fait quelques changements et ça marche,

var myArray = [AnyObject]()

self.myArray = dicResponse["data"]! as [AnyObject]
27
BaSha

Si je pouvais compléter la réponse de Teejay avec quelques informations supplémentaires. Cette erreur:

fatal error: NSArray element failed to match the Swift Array Element type

est causée par une incompatibilité de type.

Par exemple, après avoir converti votre type de tableau Swift:

    myPersonList = aDictionary["persons"] as [Person]

Accès à la valeur dans aDictionary en fonction de la clé "persons", Swift s'attend à recevoir n tableau de type Person. Cela se compilera et s'exécutera sans problème.

Cependant, plus tard dans votre code lors de l'accès à l'élément de tableau myPersonList, si le type n'est pas tel que spécifié - dans mon exemple Person - alors l'exécution se bloquera avec l'erreur ci-dessus.

Conclusion: vous avez presque certainement spécifié le mauvais type dans la distribution. Examinez votre objet dictionnaire pour voir ce qu'il contient vraiment.

20
Max MacLeod

Si vous travaillez avec les API Cocoa, vous recevez toujours un NSArray, qui est pas typé.

Donc, vous devez convertir ce tableau en un tableau Swift Array.

Vous devriez pouvoir compiler ce code:

var myArray : [CUSTOM_CLASS] = [CUSTOM_CLASS]()

self.myArray = dicResponse["data"]! as [CUSTOM_CLASS]

De cette façon, chaque élément du tableau est converti en CUSTOM_CLASS objet.

4
Teejay

TL; DR: Également causé par le mélange de binaires Xcode 7 et Xcode 7.1.

Cela a déjà été répondu, mais je viens de recevoir cette erreur dans les entrailles d'Alamofire pour une distribution de tableau d'une [chaîne] valide.

Dans mon cas, j'utilisais carthage et je n'avais pas réalisé que xcode-select pointait toujours vers le Xcode 7. crash-happy. La mise à jour de xcode-select vers Xcode 7.1B a résolu mon problème.

1
Chris Conover

Serait-ce un conflit entre Swift et ObjectiveC? Parce que j'ai rencontré une situation similaire en essayant de boucler sur un [NSMutableDisctionary] les deux avec .forEach{} et for ... in façon, mais ça m'a donné la même erreur (NSArray element failed to match the Swift Array Element type). Lorsque j'ai changé le type en [Dictionary<String,Any>] tout fonctionnait bien. Maintenant, [] a été introduit dans Swift et les types avec le préfixe NS... dans ObjectiveC.