Je lis une clé de plist (NSArray avec n NSDictionaries):
let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>
maintenant j'itère dessus:
for regionToMonitor in regionsToMonitor {
et maintenant je veux obtenir uuidString de la regionToMonitor
dans ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];
dans Swift j'essaie: let uuidString = regionToMonitor["uuid"]!.stringValue;
ce qui précède est compilé mais la chaîne est toujours nil
dans Swift. regionToMonitor["uuid"]
si utilisé sans! .stringValue fonctionne bien dans println
comment puis-je obtenir un Swift.String valide ici?
J'essaie de le transmettre à NSUUID!
J'ai aussi essayé
let uuidString:String = regionToMonitor["uuid"]
=> AnyObject n'est pas convertible en chaîne
let uuidString = regionToMonitor["uuid"] as String
=> Impossible de trouver une surcharge pour 'indice' qui accepte les arguments fournis.
let uuidString = regionToMonitor["uuid"];
=> 'AnyObject?' ne peut pas être implicitement downcast en 'String'; vouliez-vous utiliser «comme» pour forcer le downcast?
J'ai fini avec la moche ligne:
var uuidString:String = regionToMonitor["uuid"] as! String
aucun avertissement, aucune erreur, aucune erreur d'exécution
J'ai trouvé que cela fonctionne pour moi
var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String
EDIT: c'était la réponse pour une version plus ancienne de Swift
Veuillez utiliser la réponse acceptée.
AnyObject?
est facultatif, car le dictionnaire peut contenir ou non une valeur pour la clé "uuid". Pour obtenir une valeur optionnelle, vous devez décompresser. Voir Optionsals dans la documentation.
Le moyen le plus sûr de traiter une option est de la placer dans une instruction conditionnelle.
if let uuidString = regionToMonitor["uuid"] {
// do something with uuidString
}
Si vous êtes absolument certain que le dictionnaire contiendra toujours cette paire clé/valeur, vous pouvez utiliser une option implicite non enveloppée (le suffixe !
):
println("UUID: \(regionToMonitor["uuid"]!)")
Dans ce cas, s'il n'y a pas de valeur pour la clé, votre application va se bloquer.
Si vous utilisez beaucoup !
, il semble que vous hurlez tout le temps ... ce qui pourrait vous aider à comprendre pourquoi vous devriez l'utiliser avec parcimonie, voire pas du tout. :)
J'ai trouvé une solution de travail qui compile sans avertissements et autres:
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
}
La infoDictionary
de la NSBundle
renvoie une NSArray
et NSDictionary
, pas un Swift.Array
ou Swift.Dictionary
. Bien que, ils devraient être interchangeables, mais peut-être qu'ils ne sont pas comme nous avons pensé.
Je ne suis pas sûr que ma solution soit efficace ou pas, mais la voici.
var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"
J'espère que ça aide.
Vous pouvez aussi utiliser
var uuidString = regionToMonitor["uuid"]? as String
Il a les mêmes résultats que ce que vous faites, mais son intention est plus claire à mon humble avis. De toute façon, la force de l'opérateur as
se déroule, ce qui fait que le point d'exclamation est redondant. Placer le point d’interrogation derrière l’indice du dictionnaire indique clairement que vous enchaînez une option.
Si vous êtes sûr de vouloir la valeur non enveloppée, vous pouvez utiliser l’un de ces types:
var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!
ou même ceci:
if var uuidString = regionToMonitor["uuid"] {
println("\(uuidString) has been unwrapped")
}