试图在Swift 2上使用NSJSONSerialization.JSONObjectWithData

时间:2015-07-22 13:16:25

标签: swift swift2

我有这段代码

let path : String = "http://apple.com"
let lookupURL : NSURL = NSURL(string:path)!
let session = NSURLSession.sharedSession()

let task = session.dataTaskWithURL(lookupURL, completionHandler: {(data, reponse, error) in

  let jsonResults : AnyObject

  do {
    jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: [])
    // success ...
  } catch let error as NSError {
    // failure
    print("Fetch failed: \(error.localizedDescription)")
  }

 // do something

})

task.resume()

let task行失败并显示错误:

  

从类型(__.__.__)的投掷函数无效转换为   非投掷函数类型(NSData?,NSURLResponse?,NSError?) - >空隙

有什么不对?这是Xcode 7 beta 4,iOS 9和Swift 2。

编辑:

问题似乎与这些行

有关
  do {
    jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: [])
    // success ...
  } catch let error as NSError {
    // failure
    print("Fetch failed: \(error.localizedDescription)")
  }

我删除了这些行,let task错误消失了。

4 个答案:

答案 0 :(得分:9)

看起来问题出在catch声明中。以下代码不会产生您所描述的错误。

do {
    jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: [])
    // success ...
} catch {
    // failure
    print("Fetch failed: \((error as NSError).localizedDescription)")
}

我确实意识到您提供的代码应该是正确的,因此您应该考虑向Apple提交有关此问题的错误。

答案 1 :(得分:2)

Apple在许多库中使用Swift 2 编辑中的ErrorType替换了NSError。

所以用ErrorType替换你自己对NSError的显式用法。

修改

Apple已经为Swift 2中的几个库做了这个,但还不是全部。 所以你仍然需要考虑在哪里使用NSError以及在哪里使用ErrorType。

答案 2 :(得分:2)

您也可以假设没有错误:

let jsonResults = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0)) 

看,马......没有手!

答案 3 :(得分:0)

对于swift 3:

 do {
    jsonResults = try JSONSerialization.JSONObject(with: data!, options: [])
// success ...
 } catch {// failure
    print("Fetch failed: \((error as NSError).localizedDescription)")
}