Swift 2 NSURLSession.sharedSession().dataTaskWithURL Не удается вызвать со списком аргументов типа

Кажется, я не могу получить следующий код для компиляции с Xcode 7, я получаю сообщение об ошибке «Невозможно вызвать« dataTaskWithURL »со списком аргументов типа»

Похоже, что завершениеHandler больше не является необязательным, не могу понять, как переписать следующий код. Любая помощь приветствуется, спасибо

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)

    var task = session.dataTaskWithURL(url!) {
        (data, response, error) -> Void in

        if error != nil {
            print(error!.localizedDescription)
        }
        else {
            var error: NSError?

            var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
            // Do Stuff
        }
    }

    task!.resume()

person Mike U    schedule 16.06.2015    source источник


Ответы (3)


Компилятор выдает следующую ошибку:

/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28: Не удается вызвать «dataTaskWithURL» со списком аргументов типа «(NSURL, (_, _, _) throws — > Пустота)'

В completionHandler вы не перехватываете исключения, которые JSONObjectWithData может в конечном итоге сгенерировать. Поэтому компилятор делает вывод, что вы пытаетесь распространить исключение, для которого требуется, чтобы завершениеHandler имело следующую подпись:

(NSData?, NSURLResponse?, NSError?) throws -> Void

Это не соответствует фактическому ожидаемому completionHandler dataTaskWithURL и, следовательно, ошибке.

Чтобы решить эту проблему, просто оберните вызов NSJSONSerialization.JSONObjectWithData оператором do/catch следующим образом для обработки ошибки:

do {
    var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
    // Do Stuff

} catch {
    // handle error
}

Дополнительные сведения об обработке ошибок в Swift2 см. в предварительной документации, доступной здесь< /а>

person Tomas Camin    schedule 16.06.2015
comment
Обновлено с дополнительной информацией, объясняющей причины проблемы. - person Tomas Camin; 16.06.2015
comment
Я добавляю броски и делаю { try } catch {} , но все равно выдаю сообщение об ошибке Невозможно вызвать 'dataTaskWithURL' со списком аргументов типа '(NSURL, (_, _, _) throws -> Void)' - [Xcode 7 beta2] - person A.C; 26.06.2015

Начиная с Swift 2.0 (Xcode 7 beta 6), используйте dataTaskWithURL() следующим образом:

var task = session.dataTaskWithURL(url!, completionHandler: {
   (data, response, error) -> Void in

   :
})
task.resume()

Чтобы использовать NSJSONSerialization.JSONObjectWithData в обработчике завершения, вам также понадобятся ошибки отлова:

    do {
        var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
        // Do Stuff
    } catch {
        // handle error
    }
person jrc    schedule 02.09.2015
comment
Этот пост также помог мне, jeremywsherman. ком/блог/2015/06/17/ - person DogCoffee; 04.09.2015

person    schedule
comment
Пожалуйста, объясните свой код в своем ответе. Итак, любой может понять, что вы сделали до сих пор. - person ketan; 20.10.2015