【问题标题】:Xcode - Swift 2.0: "Extra argument 'error' in call" with NSJSONSerialization [duplicate]Xcode - Swift 2.0:“调用中的额外参数'错误'”与 NSJSONSerialization [重复]
【发布时间】:2017-03-10 02:29:01
【问题描述】:

我正在开发一个具有登录屏幕的应用程序,这对我来说是第一次。在关注了为此提供教程的不同网站后,我制作了一个 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 似乎工作正常(上面没有提到),以及这个文件中的其余代码,但是我在这一行读到“Extra argument 'error' in call”时遇到一个错误:

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

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

【问题讨论】:

    标签: ios swift xcode error-handling nsjsonserialization


    【解决方案1】:

    在 iOS 7 和更高版本上 NSJSONSerialization 是线程安全的。现在你可以使用 do try catch 来使用它

    斯威夫特 3:

    do{
    let JsonDict = try JSONSerialization.jsonObject(with: data, options:.MutableLeaves)
    }
    catch let error as NSError {
        print(error)
    }
    

    斯威夫特 2:

    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 吗?
    【解决方案2】:

    JSONObjectWithData 函数需要您提到的 do try catch 语法,因为该方法在其声明站点上标有 throws 关键字。 (此处的文档:https://developer.apple.com/reference/foundation/jsonserialization/1418059-jsonobject

    不要简单地使用它。

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

    这在此处的 Swift 编程语言书中有所描述:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42-ID508

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多