ios - type - swift syntax
AnyObject to Array? (4)
Estoy usando NSJSONSerialization
como tal:
let twData: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)
Esto me da un AnyObject?
.
Desde aquí, quiero convertirlo en Array<Dictionary<String,String>>
Lo intenté de todo, antes de esto:
var twDataArray: Array<Dictionary<String,String>>? = twData? as? Array<Dictionary<String,String>>
que simplemente da el error:
El tipo ''Array>'' no cumple con el protocolo ''AnyObject''.
Y poniendo la versión más simple:
var twDataArray = twData as Array
da el error:
No se puede convertir el tipo de expresión ''AnyObject?'' para escribir ''Array''
Como ya sabe, es un tipo de Cadena que está insertando en algo transformable, haga lo siguiente:
if let twoDataArray = twData as? Array<Dictionary<String, String>>{
for data in twoDataArray{
print(data)
}
}
Esto lo protegerá de una aplicación bloqueada cuando el diccionario no sea del tipo <String,String>
.
Esto funciona en un patio de juegos:
var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>
la diferencia con su código es que twData
no requiere el ?
al final - es un opcional así as?
El operador se encargará de verificar que pueda ser el caso de una variedad de diccionarios, no hace falta decir que si es nula, as?
evaluará a cero
Intente lo siguiente, puede recorrer la matriz como se indica a continuación.
for element in twData as! Array<AnyObject> {
print(element)
}
Para convertir sus datos a una matriz:
var twDataArray = (twData as! NSArray) as Array
El código anterior primero arroja twData
a un NSArray
, y luego a un Array
través de un molde puente . Un molde de puente es un tipo especial de molde que convierte un tipo de Objective-C en su _ObjectiveCBridgeable
de _ObjectiveCBridgeable
, Swift.
(Tenga en cuenta que no necesité escribir Array<AnyObject>
porque el elemento AnyObject
se infiere en el modelo de puente de NSArray
→ Array
)
Tenga en cuenta que el reparto anterior es un downcast forzado . Solo use esto si está absolutamente seguro de que twData
va a ser una instancia de NSArray
. De lo contrario, use un yeso opcional.
var twDataArray = (twData as? NSArray) as Array?