web-dev-qa-db-fra.com

AnyObject to Array?

J'utilise NSJSONSerialization comme suit:

let twData: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)

Cela me donne un AnyObject?.

De là, je veux le convertir en Array<Dictionary<String,String>>

J'ai essayé toutes sortes, menant à ceci:

var twDataArray: Array<Dictionary<String,String>>? = twData? as? Array<Dictionary<String,String>>

ce qui donne simplement l'erreur:

Le type 'Array>' n'est pas conforme au protocole 'AnyObject'.

Et en mettant la version la plus simple:

var twDataArray = twData as Array

donne l'erreur:

Impossible de convertir le type de l'expression 'AnyObject?' taper 'Array'

31
Andrew

Pour convertir vos données dans un tableau:

var twDataArray = (twData as! NSArray) as Array

Le code ci-dessus convertit d'abord twData en NSArray, puis en Array via un transtypage bridging. Une distribution en pont est un type de conversion spécial qui convertit un type Objective-C en son équivalent _ObjectiveCBridgeable conforme à Swift.

(Notez que je n'ai pas eu besoin d'écrire Array<AnyObject> car l'élément AnyObject est déduit du transtypage de pontage de NSArrayArray)

Notez que la distribution ci-dessus est un downcast forcé. Utilisez-le uniquement si vous êtes absolument certain que twData sera une instance de NSArray. Sinon, utilisez une distribution facultative.

var twDataArray = (twData as? NSArray) as Array?
28
Vatsal Manot

Essayez ce qui suit, vous pouvez parcourir le tableau comme indiqué ci-dessous.

for element in twData as! Array<AnyObject> {
    print(element)
}
2
arango_86

Cela fonctionne dans un terrain de jeu:

var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>

la différence par rapport à votre code est que twData ne nécessite pas le ? à la fin - il s'agit d'une option, l'opérateur as? veillera à vérifier qu'il peut s'agir d'un tableau de dictionnaires. Inutile de préciser que si c'est nul, as? évaluera à zéro

1
Antonio
let twData: Any = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)

Ne pas utiliser AnyObject. Utilisez Any au lieu de AnyObject. Cela fonctionnera bien. AnyObject est pour tout type de référence et Array est un type de valeur. C'est pourquoi cela vient. Changez-le en Any.

0
Ankit Tiwari