Obtenez de AnyObject(NSString) à Chaîne
Je suis de la lecture d'un fichier plist clé (NSArray avec n NSDictionaries):
let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>
maintenant, je itérer dessus:
for regionToMonitor in regionsToMonitor {
et maintenant je veux obtenir uuidString de la regionToMonitor
en ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];
dans swift j'essaie: let uuidString = regionToMonitor["uuid"]!.stringValue;
le ci-dessus ne compile mais la chaîne est toujours nil
en swift. regionToMonitor["uuid"]
utilisé sans !.stringValue fonctionne très bien dans println
comment puis-je obtenir un valide Swift.Chaîne ici?
Je suis en train de passer à NSUUID!
J'ai aussi essayé
let uuidString:String = regionToMonitor["uuid"]
=> AnyObject n'est pas convertible à Chaîne
let uuidString = regionToMonitor["uuid"] as String
=> ne Pouvait pas trouver une surcharge pour les "indice" qui accepte les arguments fournis
let uuidString = regionToMonitor["uuid"];
=> 'AnyObject?' ne peut pas être implicitement abattu à la 'Chaîne'; avez-vous l'utiliser "comme" à force abattu?
- NSString == Chaîne de caractères en Swift.
- merci c'est ce que l'IDE dit aussi 😉 - c'est ce que je pensais, mais cela ne fonctionne pas -- voir mon EDIT
Vous devez vous connecter pour publier un commentaire.
J'ai fini avec le laid ligne:
aucun avertissement, aucune erreur, aucune erreur d'exécution
regionToMonitor
étaient facultatifs NSDictionary ou de Dictionnaire, Xcode 6.3 dirais que AnyObject? ne peut pas être converti en Chaîne de caractères, ce qui est trompeur.regionToMonitor!["blah"]
et tadaaaaa....pas d'erreurs 🙂J'ai trouvé que cela fonctionne pour moi
EDIT: c'était la solution pour une ancienne swift version
Veuillez utiliser le accepté de répondre.
AnyObject?
est une option, parce que le dictionnaire peut ou peut ne pas contenir une valeur pour le "uuid" clé. Pour obtenir une option de valeur, vous devez déballer il. Voir Options dans la documentation.Le moyen le plus sûr de traiter avec une option est de le mettre dans une instruction conditionnelle.
Si vous avez absolument, positivement assurer que le dictionnaire contient toujours cette paire clé/valeur, vous pouvez utiliser un implicitement déballé optionnelle (
!
suffixe):Dans ce cas, si il n'y a pas de valeur pour la clé de votre application crash.
Si vous utilisez
!
beaucoup, on dirait que vous êtes à crier tout le temps... qui pourrait m'aider à expliquer pourquoi vous devriez l'utiliser avec parcimonie, voire pas du tout. 🙂as ...
) vous êtes en train de faire avant d'accéder au dictionnaire - cela peut être un problème avec les types déduits.NSBundle
dans votre code pour voir rapidement les déclarations. (Xcode automatiquement Swift-ifies l'en-tête de la demande, avec des commentaires.) Qui pourrait aider à déterminer le type de questions.var regions = NSBundle.mainBundle().infoDictionary["Regions"]
est AnyObject?, mais il contient un NSArray avec zéro entrées. Il n'a certainement pas de travailler sans abattu.println
un Dictionnaire de ce genre, je l'ai dit ça ne fonctionne pas, pas à cause de parens. 😉 Je n'ai aucune idée pourquoi, mais ça ne fonctionne pas. Faites le Test dans la cour de récréation.J'ai trouvé une solution qui fonctionne, qui compile sans mises en garde et tel:
La
infoDictionary
de laNSBundle
retourne unNSArray
etNSDictionary
, pas unSwift.Array
ouSwift.Dictionary
. Cependant, ils doivent être interchangeables, mais peut-être qu'ils ne sont pas comme nous mais.let dict: NSDictionary = region
a fait le tour pour moiJe ne suis pas sûr que ma solution est efficace de ne pas mais ici il est.
Espère que cela aide.
Vous pouvez également utiliser
Il a les mêmes résultats que ce que vous faites, mais est à mon humble avis plus clair dans l'intention. Le
as
opérateur de force déballe toute façon, afin de mettre le point d'exclamation derrière elle se sent inutile. Mettre le point d'interrogation derrière le dictionnaire de l'indice indique clairement que vous êtes le chaînage optionnel.Si vous êtes sûr que vous voulez la déballé valeur, vous pouvez utiliser l'un de ces:
ou même ceci:
Faire simple: