web-dev-qa-db-fra.com

Obtenez de AnyObject (NSString) à String

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?

17
Daij-Djan

J'ai fini avec la moche ligne:

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

aucun avertissement, aucune erreur, aucune erreur d'exécution

44
Daij-Djan

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.

11
Amitay

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

3
rickster

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é.

2
Leandros

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.

1
ACengiz

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.

0
Mike Seghers

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")
}
0
ggomeze