Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

Converting an Array of Dictionaries

I've been following the Swift Tutorials by Pasan, and found a nice version of my own to work on for the Weather App project.

I'm looking at an API endpoint of car park data, and I think what I'm getting back is an array of dictionaries. I feel like I'm following and translating well from Pasan's demo to my code, but in my latest change I'm making a mistake somewhere. I think I'm converting incorrectly between NSDictionary and NSArray (because Pasan's example uses a dictionary of dictionaries, so I'm not following so directly...

The code is short enough I'm just going to copy everything for ease of reference:

ViewController.swift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let parkingURL: NSURL? = NSURL(string:"https://data.bathhacked.org/resource/u3w2-9yme.json")

        let sharedSession = NSURLSession.sharedSession()
        let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(parkingURL!, completionHandler: { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

            if (error == nil) {
                let dataObject = NSData(contentsOfURL: location)
                let parkingDataArray: NSArray = NSJSONSerialization.JSONObjectWithData(dataObject!, options: nil, error: nil) as NSArray

                let oddDownCPInfo = ParkingData(parkingDataArray: parkingDataArray)
                println(oddDownCPInfo)

// I think what's going wrong here is that I'm downcasting between Dict and Array incorrectly somehow. Could be completely wrong though...


//            println(parkingDataArray)
//                
//                let oddDownCPInfo = parkingDataArray[0] as NSDictionary
//                println(oddDownCPInfo)
//                
//                let landsdownCPArray: NSArray = parkingDataArray[0] as NSArray
////                println(landsdownCPArray)


            } else {
                println("Something went wrong")
            }

        })

        downloadTask.resume()

    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



}

and ParkingData.swift

struct ParkingData {

    var name: String
    var capacity: Int
    var occupancy: Int
    var percentage: Int
    var status: String
    var lastupdate: String
    var dateuploaded: String
    var description: String
    var northing: Int
    var easting: Int
    var id: String

    init(parkingDataArray: NSArray) {

        let oddDownParkingData = parkingDataArray[0] as NSDictionary

// I think what's going wrong here is that I'm downcasting between Dict and Array incorrectly somehow. Could be completely wrong though...

        name = oddDownParkingData["name"] as String
        capacity = oddDownParkingData["capacity"] as Int
        occupancy = oddDownParkingData["occupancy"] as Int
        percentage = oddDownParkingData["percentage"] as Int
        status = oddDownParkingData["status"] as String
        lastupdate = oddDownParkingData["lastupdate"] as String
        dateuploaded = oddDownParkingData["dateuploaded"] as String
        description = oddDownParkingData["description"] as String
        northing = oddDownParkingData["northing"] as Int
        easting = oddDownParkingData["easting"] as Int
        id = oddDownParkingData["id"] as String
    }

}