Swift - itérer gamme de dictionnaires
Essayer de trouver le titre de chaque livre:
var error: NSError?
let path = NSBundle.mainBundle().pathForResource("books", ofType: "json")
let jsonData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)
let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary
let books = jsonDict["book"]
var bookTitles:[String]
//for bookDict:Dictionary in books {
// println("title: \(bookDict["title"])")
//}
Quand je décommenter ces trois dernières lignes, tout l'enfer se déchaîne dans Xcode6 beta3 - tout le texte devient blanc, je reçois constante "SourceKitService Terminé" et "fonctionnalité d'Éditeur temporairement limitée" fenêtres pop-up, et j'obtiens ces erreurs de build:
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal
J'ai gravement offensé le compilateur ici. Alors, quelle est la bonne façon de parcourir le tableau de dictionnaires et de trouver le "titre" de la propriété de chaque dict?
Ne pas ignorer l'erreur se reproduit, le professionnalisme exige l'erreur chemins à être manipulés.
println()
jsonData
, jsonDict
, books
. Ajouter une erreur var à NSData.dataWithContentsOfFile
. Vérifier les valeurs de retour et println()
toute erreur vars si il y a une erreur. Non pas que println()
suffit d'erreur de manipulation. Le trempage à travers avec le débogueur est également utile d'processus de débogage.OriginalL'auteur soleil | 2014-07-21
Vous devez vous connecter pour publier un commentaire.
Vous rencontrez des problèmes, parce que Swift est pas en mesure de déduire que les livres est un objet iterable type. Si vous connaissez le type de la matrice de passe, vous devez être explicitement casting de ce type. Si par exemple, le tableau doit être un tableau de dictionnaires qui ont les chaînes de caractères comme des objets et des clés, vous devez effectuer les opérations suivantes.
Notez également que vous devez supprimer l'indice dictionnaire d'accès à partir de la chaîne d'interpolation, car il contient des guillemets. Vous avez juste à le faire sur deux lignes.
Dans ce cas, vous auriez probablement souhaitez utiliser [[Chaîne:AnyObject]]. Bien sûr, cela signifierait que vous auriez à répéter le si... à vérifier ce cas, vous êtes actuellement aux prises avec.
Si ça aide quelqu'un d'autre, le [[Chaîne:Chaîne]] bit est à dire "les livres est (potentiellement) un tableau de dictionnaires où la clé et la valeur sont les deux chaînes" ou de ce format qui est plus familier pour moi: Array<Dictionnaire<String,String>>
OriginalL'auteur Mick MacCallum