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 2 和 Cloudkit 的通知

Swift / Cloudkit 谓词格式

swift Swift - CloudKit - 删除订阅

swift Swift - CloudKit - 谓词来获取用户

swift Swift - CloudKit - 获取用户ID

swift Swift - CloudKit - 推送通知