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 Build a Weather App with Swift (Retired) Data Modeling With Structures Using Structures to Model Data

This code doesn't compile with the latest iteration of Swift.

This code fails at the currentWeatherDictionary step. Error reads as '(StringLiteralConvertible) -> $T2 is not identical to 'NSDictionary'.

3 Answers

The teacher download code will not compile, you are correct. If you go through some of the forum posts related to earlier steps, you will see that some students have pointed out changes needed.

Try replacing the viewDidLoad() function in the ViewController with the following. This takes care of unwrapping some optionals. I would not be surprised if that takes care of the error.

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

        let baseURL = NSURL(string: "https://api.forecast.io/forecast/\(apiKey)/")


        if let forecastURL = NSURL(string: "37.8267,-122.423", relativeToURL: baseURL) {


            let sharedSession = NSURLSession.sharedSession()

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


                if (error == nil) {
                    if let dataObject = NSData(contentsOfURL: location) {

                    let weatherDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataObject, options: nil, error: nil) as NSDictionary

                    println(weatherDictionary)

                    }
                }
            })

            downloadTask.resume()
        }
    }

Try to change options: nil in

NSJSONSerialization.JSONObjectWithData(dataObject, options: nil, error: nil) as NSDictionary

to options: NSJSONReadingOptions(0), it works for me.

Sigurdur Haraldsson
Sigurdur Haraldsson
1,793 Points

Having the same problem. Copied the code above and still doesn't fix it."'(StringLiteralConvertible) -> $T2 is not identical to 'NSDictionary'." Always comes up, can anyone help me ?