【问题标题】:Swift: Extra argument 'error' in callSwift:调用中的额外参数“错误”
【发布时间】:2015-09-13 10:14:03
【问题描述】:

我目前正在使用 Swift 2.0 和 Xcode Beta 2 开发我的第一个 iOS 应用程序。它读取外部 JSON 并在表格视图中生成包含数据的列表。但是,我遇到了一个似乎无法修复的奇怪小错误:

Extra argument 'error' in call

这是我的代码的 sn-p:

let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
            print("Task completed")

            if(error != nil){
                print(error!.localizedDescription)
            }

            var err: NSError?

            if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{

                if(err != nil){
                    print("JSON Error \(err!.localizedDescription)")
                }

                if let results: NSArray = jsonResult["results"] as? NSArray{
                    dispatch_async(dispatch_get_main_queue(), {
                        self.tableData = results
                        self.appsTableView!.reloadData()
                    })
                }
            }
        })

在这一行抛出错误:

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{

谁能告诉我我在这里做错了什么?

【问题讨论】:

  • 这条线没有给出这个错误,我想可能是因为你进入了不同的线。
  • 使用 2.0,您需要创建一个 do catch 块。 error 不再是 NSJSONSerialization 的参数。这个问题还有很多其他的答案。寻找做,抓住 Swift 2.0

标签: ios swift2 xcode7-beta2


【解决方案1】:

Swift 2 中,NSJSONSerialization签名 已更改,以符合新的错误处理系统。

这是一个如何使用它的示例:

do {
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

根据the Swift API Design Guidelines,在 Swift 3 中,NSJSONSerialization名称 及其方法发生了变化。

下面是同样的例子:

do {
    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

【讨论】:

  • 我正在使用 swift 2.2,并尝试了您的第一个版本。它正在正确编译,但它正在悄无声息地死去,没有击中任何print 行。当我删除 jsonResult 前面的 if 部分并运行时,我可以推断 jsonResult 被设置为 nil 没有错误。我确定数据以有效的 json 字符串开头...
  • @jeffery_the_wind 您的 JSON 可能与您的想法不同。试试这个:stackoverflow.com/a/33510776/2227743
  • 谢谢,就是这样!在您的第一个示例中将as? NSDictionary 替换为as? NSArray 对我有用。
【解决方案2】:

在 Swift 2 中情况发生了变化,接受 error 参数的方法被转换为抛出该错误的方法,而不是通过 inout 参数返回它。通过查看Apple documentation

在 SWIFT 中处理错误: 在 Swift 中,此方法返回一个非可选结果,并使用 throws 关键字进行标记,表示在失败的情况下它会抛出错误。

您在 try 表达式中调用此方法并处理 do 语句的 catch 子句中的任何错误,如 Swift 编程语言 (Swift 2.1) 中的错误处理和将 Swift 与 Cocoa 和 Objective-C 一起使用中的错误处理中所述(斯威夫特 2.1)。

最短的解决方案是使用try?,如果发生错误,则返回nil

let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments)
if let dict = message as? NSDictionary {
    // ... process the data
}

如果您也对该错误感兴趣,可以使用do/catch

do {
    let message = try NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments)
    if let dict = message as? NSDictionary {
        // ... process the data
    }
} catch let error as NSError {
    print("An error occurred: \(error)")
}

【讨论】:

    【解决方案3】:

    这已在 Swift 3.0 中进行了更改。

     do{
                if let responseObj = try JSONSerialization.jsonObject(with: results, options: .allowFragments) as? NSDictionary{
    
                    if JSONSerialization.isValidJSONObject(responseObj){
                        //Do your stuff here
                    }
                    else{
                        //Handle error
                    }
                }
                else{
                    //Do your stuff here
                }
            }
            catch let error as NSError {
                    print("An error occurred: \(error)") }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多