variable type strong protocol has generic extension ios xcode swift type-conversion

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 NSArrayArray )

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?