Подтвердить что ты не робот

Swift: дополнительный аргумент "ошибка" в вызове

В настоящее время я разрабатываю свое первое приложение для iOS с использованием Swift 2.0 и Xcode Beta 2. Он считывает внешний 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{

Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?

4b9b3361

Ответ 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)
}

С Swift 3 имя NSJSONSerialization и его методы изменились в соответствии с Руководства по дизайну 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)
}

Ответ 2

Изменения в Swift 2 изменились, методы, принявшие параметр error, были преобразованы в методы, которые генерируют эту ошибку вместо того, чтобы возвращать ее с помощью параметра inout. Посмотрев документацию Apple:

ОБРАЩЕНИЕ ОШИБКИ В SWIFT: В Swift этот метод возвращает неоптический результат и помечен ключевым словом throw, чтобы указать, что он выдает ошибку в случаях сбоя.

Вы вызываете этот метод в выражении try и обрабатываете любые ошибки в предложениях catch инструкции do, как описано в разделе Обработка ошибок на языке Swift Programming (Swift 2.1) и Обработка ошибок при использовании Swift с Cocoa и Objective-C (Swift 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)") }