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'
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 NSArray
→ Array
)
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?
Essayez ce qui suit, vous pouvez parcourir le tableau comme indiqué ci-dessous.
for element in twData as! Array<AnyObject> {
print(element)
}
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
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
.