Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - iterate array of dictionaries

Trying to find the title of each book:

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"])")
    //}

When I uncomment those last three lines, all hell breaks loose in Xcode6 beta3 - all text turns white, I get constant "SourceKitService Terminated" and "Editor functionality temporarily limited" popups, and I get these helpful build errors:

<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal

I have seriously offended the compiler here. So what is the correct way to iterate through the array of dictionaries and find the "title" property of each dict?

like image 221
soleil Avatar asked Jul 21 '14 21:07

soleil


1 Answers

You're having issues because Swift is unable to infer that books is an iterable type. If you know the type of the array going in, you should be explicitly casting to this type. If for example, the array should be an array of dictionaries which have strings as objects and keys, you should do the following.

if let books = jsonDict["book"] as? [[String:String]] {
    for bookDict in books {
        let title = bookDict["title"]
        println("title: \(title)")
    }
}

Also note that you have to remove the subscript dictionary access from the string interpolation because it contains quotation marks. You just have to do it on two lines.

like image 124
Mick MacCallum Avatar answered Nov 15 '22 02:11

Mick MacCallum