現在、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{
誰かが私がここで間違っていることを教えてもらえますか?
Swift 2では、NSJSONSerialization
のsignatureが変更され、新しいエラー処理システム。
以下に使用方法の例を示します。
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
Swift 3では、NSJSONSerialization
のnameとそのメソッドが変更されました。 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)
}
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)")
}
これは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)") }