我试图在从 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!'
我可以通过将 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#//apple_ref/doc/uid/TP40014097-CH42 只允许第二种语法,除非您拥有从 ErrorType 类型的枚举结构中抛出错误的对象,因为我想捕获 NSError来自 String 对象,contentsOfURL 函数。
我希望有人能指导我完成这个,也许是 XCode 7 一个测试版,catch 语法仍然不完整,或者我不应该关心这个函数失败的原因,但我认为确定是什么导致这个函数失败很重要以及是否可以在到达 do-try-catch 子句之前对其进行跟踪和修复。
除了上述错误之外,我在 BFTask() 的任务变量分配行中收到警告说“从未使用过不可变值‘任务’的初始化”。我认为这是这个 beta 版本的一个错误,它不包括确认变量任务正在异步块中使用的模式。如果我只需要忽略它,我将不胜感激。
顺便说一句,我使用 XCode 7 beta 的唯一原因是因为我的客户想在获得苹果会员资格之前评估应用程序。