Ios Xcode-Swift 2.0:“;额外参数';错误';“随时待命”;使用NSJSONSerialization

Ios Xcode-Swift 2.0:“;额外参数';错误';“随时待命”;使用NSJSONSerialization,ios,swift,xcode,error-handling,nsjsonserialization,Ios,Swift,Xcode,Error Handling,Nsjsonserialization,我正在开发一个具有登录屏幕的应用程序,这对我来说还是第一次。在浏览了提供这方面教程的不同网站之后,我制作了一个LoginService ViewController,它将有助于登录应用程序的过程 以下是我在此ViewController中使用的部分代码: // MARK: Private Methods private func exchangeTokenForUserAccessTokenWithCompletionHandler(username: String, password: S

我正在开发一个具有登录屏幕的应用程序,这对我来说还是第一次。在浏览了提供这方面教程的不同网站之后,我制作了一个LoginService ViewController,它将有助于登录应用程序的过程

以下是我在此ViewController中使用的部分代码:

 // MARK: Private Methods

private func exchangeTokenForUserAccessTokenWithCompletionHandler(username: String, password: String, completion: (OAuthInfo?, error: String?) -> ()) {

    let path = "/oauthfake/token/"
    let url = ConnectionSettings.apiURLWithPathComponents(path)
    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"

    var params =  "client_id=\(ConnectionSettings.clientId)&client_secret=\(ConnectionSettings.clientSecret)&grant_type=password&login=\(username)&password=\(password)"

    var err: NSError?
    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")


    let task = session.dataTaskWithRequest(request) {data, response, error -> Void in

        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary

        if (err != nil) {

            // Something went wrong, log the error to the console.
            print(err!.localizedDescription)
            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("Something went wrong: '\(jsonStr)")

            completion(nil, error: err?.localizedDescription)
        } else {
            if let parseJSON = json {
                if let token = parseJSON.valueForKey("access_token") as? String {
                    if var issuedAt = parseJSON.valueForKey("issued_at") as? String {
                        if var tokenExpiresIn = parseJSON.valueForKey("expires_in") as? String {
                            if var refreshTokenIssuedAt = parseJSON.valueForKey("refresh_token_issued_at") as? String {
                                if let refreshToken = parseJSON.valueForKey("refresh_token") as? String {
                                    if var refreshTokenExpiresIn = parseJSON.valueForKey("refresh_token_expires_in") as? String {
                                        if let refreshCount = parseJSON.valueForKey("refresh_count") as? String {

                                            let epochIssuedAt:Double = (issuedAt as NSString).doubleValue / 1000.0
                                            let epochRefreshTokenIssuedAt:Double = (refreshTokenIssuedAt as NSString).doubleValue / 1000.0

                                            let oauthInfo = OAuthInfo(issuedAt: epochIssuedAt, refreshTokenIssuedAt: epochRefreshTokenIssuedAt, tokenExpiresIn: (tokenExpiresIn as NSString).doubleValue, refreshToken: refreshToken, token: token, refreshTokenExpiresIn: (refreshTokenExpiresIn as NSString).doubleValue, refreshCount: (refreshCount as NSString).integerValue)

                                            completion(oauthInfo, error: err?.localizedDescription)
我的super.init似乎工作得很好(上面没有介绍),以及该文件中的其他代码,但我在这一行上看到一个错误,读到“额外参数'error'in call”:

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary

我已经收集到Swift 2.0处理错误的方式与我习惯的不同。我知道这个版本的Swift使用try、let和catch代码来处理错误。我的问题是我以前没有使用过这些类型的代码,我不确定在这种特殊情况下如何使用它们。

函数要求使用您提到的
do
try
catch
语法,因为其声明站点上的方法被标记为
throws
关键词。(此处的文档:)

不,只是简单地使用它

do {
try someMethodWhichCanThrow()
catch(error) {
// maybe log the error here
}

这在Swift编程语言书中有描述:

在iOS 7上,后者的NSJSONSerialization是线程安全的。现在您可以使用
do try catch

Swift 3:

do{
let JsonDict = try JSONSerialization.jsonObject(with: data, options:.MutableLeaves)
}
catch let error as NSError {
    print(error)
}
do{
  let jsonDict = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as! [String:AnyObject]
}catch let error as NSError{
  print(error)
}
Swift 2:

do{
let JsonDict = try JSONSerialization.jsonObject(with: data, options:.MutableLeaves)
}
catch let error as NSError {
    print(error)
}
do{
  let jsonDict = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as! [String:AnyObject]
}catch let error as NSError{
  print(error)
}

感谢您的反馈,看到您如何布置语法非常有帮助!如果可以提问(对不起,我仍在了解这一点),我想确定我应该把do-try-catch代码放在哪里,与我遇到的NSJSONSerialization错误行进行比较。@R.Osolinski:是否要比较两个NSJSONSerialization?