ios nsstring swift

ios - Obtener de AnyObject(NSString) a String



swift (8)

Estoy leyendo una clave de plist (NSArray with n NSDictionaries):

let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>

ahora lo repito:

for regionToMonitor in regionsToMonitor {

y ahora quiero obtener uuidString del regionToMonitor

en ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];

en swift intento: let uuidString = regionToMonitor["uuid"]!.stringValue;

Lo anterior se compila, pero la cadena siempre es nil en swift. regionToMonitor["uuid"] cuando se usa sin! .stringValue funciona bien en println

¿Cómo consigo un Swift.String válido aquí?

Estoy tratando de pasárselo a NSUUID!

Yo tambien lo intenté

let uuidString:String = regionToMonitor["uuid"]
=> AnyObject no es convertible a String

let uuidString = regionToMonitor["uuid"] as String
=> No se pudo encontrar una sobrecarga para el ''subíndice'' que acepta los argumentos proporcionados

let uuidString = regionToMonitor["uuid"];
=> ''AnyObject?'' no se puede bajar implícitamente a ''Cadena''; ¿Querías usar ''como'' para forzar la caída?


Encontré esto para trabajar para mí

var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String

EDITAR: esta fue la respuesta para una versión swift más antigua

Por favor use la respuesta aceptada.


He encontrado una solución de trabajo, que compila sin advertencias y tales:

var regions = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String, AnyObject>> for region in regions { let dict: NSDictionary = region var uuid = dict["uuidString"] as String }

El infoDictionary del NSBundle devuelve un NSArray y un NSDictionary , no un Swift.Array o Swift.Dictionary . Sin embargo, deberían ser intercambiables, pero tal vez no sean como nosotros pensamos.


Mantenlo simple:

let uuidString = "/(regionToMonitor["uuid"])"


No estoy seguro de que mi solución sea efectiva o no, pero aquí está.

var uuidVar = regionToMonitor["uuid"] var uuidString:String = "/(uuidVar)"

Espero eso ayude.


Si está seguro de que desea el valor no envuelto, puede utilizar cualquiera de estos:

var uuidString:String! = regionToMonitor["uuid"] var uuidString = regionToMonitor["uuid"] as String!

o incluso esto:

if var uuidString = regionToMonitor["uuid"] { println("/(uuidString) has been unwrapped") }


También puedes usar

var uuidString = regionToMonitor["uuid"]? as String

Tiene los mismos resultados que lo que está haciendo, pero es mi intención más clara en mi humilde opinión. La fuerza del operador as se desenvuelve de todos modos, por lo que poner el signo de exclamación detrás de ella se siente redundante. Poner el signo de interrogación detrás del subíndice del diccionario deja claro que está encadenando un opcional.


Terminé con la línea fea:

var uuidString:String = regionToMonitor["uuid"] as! String

No hay advertencias, no hay errores, no hay error de tiempo de ejecución


AnyObject? es opcional, porque el diccionario puede o no contener un valor para la clave "uuid". Para obtener un valor opcional, debe desenvolverlo . Ver Optionals en la documentación.

La forma más segura de lidiar con un opcional es ponerlo en una declaración condicional.

if let uuidString = regionToMonitor["uuid"] { // do something with uuidString }

Si está absolutamente seguro de que el diccionario siempre contendrá este par clave / valor, puede usar un opcional implícitamente sin envolver (el sufijo ! ):

println("UUID: /(regionToMonitor["uuid"]!)")

En este caso, si no hay valor para la clave, su aplicación se bloqueará.

Si lo usas ! mucho, parece que estás gritando todo el tiempo ... lo que podría ayudar a ilustrar por qué deberías usarlo con moderación, en todo caso. :)