Обработка ошибки с использованием бета-версии xcode 7.0 в асинхронном блоке

Я пытаюсь проверить различные ошибки при загрузке текстовых файлов из AWS S3 и следующего фрагмента кода:

... above here function receiving String parameters ruta, archivo, archivoLocal
let directorioURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL
let archivoURL = directorioURL.URLByAppendingPathComponent("b\(archivoLocal)")
let downloadRequest = AWSS3TransferManagerDownloadRequest()
downloadRequest.bucket = ruta
downloadRequest.key = archivo
downloadRequest.downloadingFileURL = archivoURL

let transferManager = AWSS3TransferManager.defaultS3TransferManager()
let task = BFTask()
let executor = BFExecutor.mainThreadExecutor()
transferManager.download(downloadRequest).continueWithExecutor(executor, withBlock: { (task) -> AnyObject! in
if task.error != nil {
    if task.error.domain == AWSS3TransferManagerErrorDomain {
        self.processDomainErrorType(AWSS3TransferManagerErrorType(rawValue: task.error.code))
    } else {
        self.processError(task.error)
    }
} else if task.result != nil {
    do {
        let mytext = try String(contentsOfURL: archivoURL, encoding: NSUTF8StringEncoding)
        self.processResult(mytext)
    } catch let urlerror as? NSError {
        self.processError(urlerror)
    }
}
...

Я получаю ошибку:

Invalid conversion from throwing function of type '(_) throws -> AnyObject!' to non-throwing function type '@convention(block) (BFTask!) -> AnyObject!'

Я получил синтаксис "do { try } catch" по https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html

Я могу удалить ошибку, заменив выражение catch на:

    } catch _ {
        self.processError(NSError(domain: "String-ContentsOfURL Error", code: 100, userInfo: nil))
    }

Конечно, таким образом я никогда не узнаю истинную причину, по которой ContentsOfURL может потерпеть неудачу.

Все, что я могу выяснить, почему эта ошибка происходит, потому что этот синтаксис действителен только для приложений OS X и для iOS руководство по обработке ошибок по адресу https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html допускает только второй синтаксис, если только вы не являетесь владельцем объекта, выбрасывающего ошибки из структуры enum типа ErrorType, а это не так, поскольку я хочу перехватить ошибку NSError из объекта String, функция contentsOfURL.

Я надеюсь, что кто-то может мне помочь в этом, может быть, XCode 7 является бета-версией, синтаксис catch по-прежнему неполон или, возможно, мне не важно знать причину сбоя этой функции, но я думаю, что важно определить, что делает эту функцию неудачной. и если это можно было бы отследить и исправить до достижения предложения do-try-catch.

В дополнение к вышеупомянутой ошибке я получаю предупреждение в строке назначения переменной задачи для BFTask(), говорящее, что "Инициализация неизменяемого значения" задача "никогда не использовалась". Я думаю, что это ошибка в этой бета-версии, которая не включает шаблон для подтверждения того, что переменная задача используется в асинхронном блоке. Я был бы очень признателен за подтверждение этого, и если мне просто нужно это игнорировать.

Кстати, единственная причина, по которой я использую бета-версию XCode 7, заключается в том, что мой клиент хочет оценить приложение, прежде чем получить членство в Apple.

1 ответ

Apple заменила NSError на ErrorType в Swift 2.

Замените ваше собственное явное использование NSError на ErrorType, и вы не получите этот тип ошибок компилятора.

Другие вопросы по тегам