web-dev-qa-db-ja.com

Swift:呼び出し中の余分な引数 'error'

現在、Swift 2.0およびXcode Beta 2を使用して最初のiOSアプリを開発しています。外部JSONを読み取り、データを含むテーブルビューでリストを生成します。ただし、私が修正できないように見える奇妙な小さなエラー:

Extra argument 'error' in call

ここに私のコードのスニペットがあります:

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{

誰かが私がここで間違っていることを教えてもらえますか?

47
kaanmijo

Swift 2では、NSJSONSerializationsignatureが変更され、新しいエラー処理システム。

以下に使用方法の例を示します。

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

Swift 3では、NSJSONSerializationnameとそのメソッドが変更されました。 Swift API設計ガイドライン

同じ例を次に示します。

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

Swift 2)で状況が変わりました。errorパラメーターを受け入れるメソッドは、inoutパラメーター経由で返すのではなく、そのエラーをスローするメソッドに変換されました。 Appleドキュメント を見てください:

Swiftでのエラーの処理:Swiftでは、このメソッドはオプションではない結果を返し、throwsキーワードでマークされて、失敗した場合にエラーをスローすることを示します。

Swiftプログラミング言語(Swift 2.1)のエラー処理およびUsing =のエラー処理で説明されているように、このメソッドをtry式で呼び出し、doステートメントのcatch句でエラーを処理します。 Swift CocoaおよびObjective-C(Swift 2.1)を使用。

最短の解決策は、エラーが発生した場合にnilを返すtry?を使用することです。

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)")
}
5
Cristik

これは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)") }
0
CodeSteger