我目前正在通过这个示例应用程序学习Swift 2.0和OAuth的集成:https://github.com/soundcloud/iOSOAuthDemo
下面的代码片段导致了一些问题,并导致应用程序在编译时失败。
private func requestMe(token: String) {
let url = NSURL(string: "https://api.soundcloud.com/me.json?oauth_token=(token)")!
let request = NSURLRequest(URL: url)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
let dataTask = session.dataTaskWithURL(url) { (data, response, error) -> Void in
if let jsonOutput = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as? [String:AnyObject] {
self.displayMe(jsonOutput)
}
}
dataTask.resume()
}
然而,当编译时,我的错误处理看起来好像在这个版本的Swift(2.0)中发生了变化,并导致以下错误:
编译时调用的额外参数'error'。
我已经查看了以下关于这个问题的堆栈帖子:Swift: Extra argument 'error'在调用
并调整了我的代码,以尝试纠正错误处理如下:
let dataTask = session.dataTaskWithURL(url) { (data, response, error) -> Void in
if let jsonOutput = NSJSONSerialization.JSONObjectWithData(data, options: nil) as? [String:AnyObject] {
self.displayMe(jsonOutput)
}
}
catch let error as NSError {
print(error);}
dataTask.resume()
}
我也试过修改:
(data, options: nil, error: nil)
(data:NSData?, error:NSError?)
然而,这些都不能解决问题。有没有人能告诉我,我在处理这个错误时可能犯了一个愚蠢的错误。
提前感谢!
您的代码有几个问题:您添加了catch
,但忘记了do
和try
。此外,你不能再传递nil
作为NSJSONSerialization的选项参数,你必须安全地打开data
可选。
这里有一个固定的版本:
let dataTask = session.dataTaskWithURL(url) { (data, response, error) -> Void in
do {
if let myData = data, let jsonOutput = try NSJSONSerialization.JSONObjectWithData(myData, options: []) as? [String:AnyObject] {
self.displayMe(jsonOutput)
}
} catch let error as NSError {
print(error)
}
}
dataTask.resume()