Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误
Posted
技术标签:
【中文标题】Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误【英文标题】:Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock Error 【发布时间】:2016-08-07 15:31:58 【问题描述】:我正在关注WWDC Session about CloudKit。在这里,有这段代码被剪掉了:
let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: privateDatabaseChangeToken)
//(...)
changesOperation.fetchDatabaseChangesCompletionBlock =
(newToken: CKServerChangeToken?, more: Bool, error: NSError?) -> Void in
// error handling here
self.sharedDBChangeToken = newToken // cache new token
self.fetchZoneChanges(callback) // using CKFetchRecordZoneChangesOperation
即使代码是从幻灯片中完全复制的,XCode 还是会出现这个错误:
无法将类型 '(CKServerChangeToken?, Bool, NSError?) -> Void' 赋值给类型 '((CKServerChangeToken?, Bool, Error?) -> Void)?'
我使用的是 XCode 8.0 Beta 4,目标是 ios 10,以防这应该是编译器错误。
【问题讨论】:
【参考方案1】:在 Beta 4[需要引用],实施了 swift-evolution 提案 SE-0112,影响了错误处理。
这里重要的是,Objective-C NSError
类型在 Swift 中被导入为 Error
(以前称为 ErrorProtocol
)类型,而不是 NSError
。
只需更新您的类型注释:
changesOperation.fetchDatabaseChangesCompletionBlock =
(newToken: CKServerChangeToken?, more: Bool, error: Error?) -> Void in
// ...
附带说明,您实际上可以完全省略参数类型:
changesOperation.fetchDatabaseChangesCompletionBlock = newToken, more, error in
// ...
对于错误处理,据我所知,传递的错误通常是CKError
,它是一个新的(?)结构,它封装了旧的userInfo
字典的所有(?)@ 987654331@。
changesOperation.fetchDatabaseChangesCompletionBlock = newToken, more, error in
guard error == nil else
if let ckerror = error as? CKError
// ... Handle the CKError
return
// ... Do something useful
【讨论】:
以上是关于Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误的主要内容,如果未能解决你的问题,请参考以下文章
swift Swift - CloudKit - 谓词来获取用户