我有这段代码
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
错误消失了。
答案 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)")
}