2015-07-02 2 views
1

Я не могу понять, как решить эту проблему.не может вызывать 'jsonObjectWithData'

Это из учебника youtube для создания простого приложения Weather. Учебник был загружен в марте 2015 года и поэтому написан в предыдущей версии Swift, там он работал, а текущий Swift 2 - нет.

Ошибки я получаю: «не может ссылаться на„jsonObjectWithData“со списком аргументов типа„(NSData, опции: ноль, ошибка: NSError)“»

func getWeatherData(urlString:String) { 

    let url = NSURL(string: urlString) 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!){ (data, response, error) in 
     dispatch_async(dispatch_get_main_queue(), { 

     self.setLabels(data) 

     }) 

    } 

    task.resume() 

} 

func setLabels(weatherData: NSData) { 

    var jsonError: NSError 

    let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: jsonError) 

    if let name = json["name"] as? String { 

     self.ResultLabel.text = name 
    } 
} 
+0

у вас есть один бродячих «}» в вашем коде, сразу после 'self.ResultLabel.text = name' – trevorj

ответ

0

Вам нужно передать указатель ошибки в NSJSONSerialization.JSONObjectWithData(...) с &.

let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: &jsonError) // &jsonError points to the NSErrorPointer of the NSError object 
+0

Я не з теперь как это было принято в качестве ответа, по крайней мере, в Swift 2 (с XCode 8 Beta 3). Это не работает и продолжает генерировать синтаксическую ошибку, что есть дополнительный аргумент «ошибка». –

1

Попробуйте это:

var jsonError: NSError? 
let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: &jsonError) 
3

, если вы хотите, чтобы получить этот код, готовый к Swift 2, вы должны запустить JSONParser с попыткой и поймать возможные ошибки.

private func httpGetRequest(request: NSURLRequest!, callback: (NSData?, String?) -> Void) { 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(request){ 
     (data, response, error) -> Void in 
     if error != nil { 
      callback(nil, error!.localizedDescription) 
     } else { 
      callback(data, nil) 
     } 
    } 
    task!.resume() 
} 

func setLabels(weatherData: NSData) { 
    do { 
     let json = try NSJSONSerialization.JSONObjectWithData(weatherData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
     if let name = json["name"] as? String { 
      self.resultLabel.text = name 
     } 
    } catch { 
     print(error) 
     self.resultLabel.text = "Lorem Ipsum" 
    } 
} 

func loadWeatherData() { 
    let weatherRequest = NSMutableURLRequest(URL: NSURL(string: "Your URL String goes here")!) 
    httpGetRequest(weatherRequest){ 
     (data, error) -> Void in 
     if error != nil { 
      print("Error: \(error)") 
     } else { 
      self.setLabels(data!) 
     } 
    } 
} 

Надеюсь, что это поможет решить ваши проблемы.

-1

В Swift 3, вы можете исправить ту же ошибку с кодом ниже:

do{ 
    let jsonData = try JSONSerialization.jsonObject(with: (data)!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: AnyObject] 
}catch{ 
    print("Error while parsing JSON: Handle it") 
} 
0

в скор 3,0 попробовать это ...

do { 

let jsonData = try JSONSerialization.data(withJSONObject: your array or dictionary, options: JSONSerialization.WritingOptions()) as NSData 

let json = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions(rawValue: UInt(0))) 

} 

catch 
{ 
} 
0

В быстром 3 вы можете попробовать это:

func setLabels(weatherData: NSData) { 
     do { 
      var jsonError: NSError 
      let json = try JSONSerialization.jsonObject(with: weatherData as Data, options: []) as! NSDictionary 

      if let name = json["name"] as? String { 
       self.ResultLabel.text = name 
      } 
     } catch { 

     } 

    } 
Смежные вопросы