Обработка ошибки с использованием бета-версии 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, и вы не получите этот тип ошибок компилятора.