Feng Wei Hsu
Feng Wei Hsu

Reputation: 3

Swift NSURL nil when running the application

When I run the application Xcode told me that unexpectedly found nil while unwrapping an Optional value at the url but the url isn't nil, can someone help?

here is the code

import Foundation

protocol WeatherUndergroundServiceByGeographicalDelegate{

    func setWeatherByGeographical(weather:WeatherUnderground)
}

class WeatherUndergoundServiceByGeographical{

    var delegate:WeatherUndergroundServiceByGeographicalDelegate?

    func getWeatherFromWeatherUnderground(latitude:Double, longitude:Double){

        let path = "http://api.wunderground.com/api/48675fd2f5485cff/conditions/geolookup/q/\(latitude,longitude).json"
        let url = NSURL(string: path)


        //session
        let session = NSURLSession.sharedSession()


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Error is at here~~~~~~~~~~~~~~~~~~~~~~~~~
        let task = session.dataTaskWithURL(url!) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            let json = JSON(data: data!)
            //parsing json weather condition from weather api. using swiftyJson
            let name = json["current_observation"]["display_location"]["city"].string
            let temp = json["current_observation"]["temp_c"].double
            let windsp = json["current_observation"]["wind_mph"].double

            //prasing the weather data
            let weather = WeatherUnderground(cityName: name!, temperature: temp!, windSpeed: windsp!)

            if self.delegate != nil{
                dispatch_async(dispatch_get_main_queue(), { () -> Void in

                    self.delegate?.setWeatherByGeographical(weather)

                })
            }
        }
        task.resume()
    }


}

Upvotes: 0

Views: 145

Answers (2)

Yuriy Pavlyshak
Yuriy Pavlyshak

Reputation: 337

You probably have error in your path string, try this:

let path = "http://api.wunderground.com/api/48675fd2f5485cff/conditions/geolookup/q/\(latitude),\(longitude).json"

The reason is that you are interpolating tuple value \(latitude,longitude) in the string, which adds extra space and makes url string invalid because space is not percent-escaped. Instead you have to interpolate each value with a comma between them: \(latitude),\(longitude)

Upvotes: 2

Jim
Jim

Reputation: 73936

let path = "http://api.wunderground.com/api/48675fd2f5485cff/conditions/geolookup/q/\(latitude,longitude).json"

I think you mean:

let path = "http://api.wunderground.com/api/48675fd2f5485cff/conditions/geolookup/q/\(latitude),\(longitude).json"

Upvotes: 0

Related Questions