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. :)