加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Swift 3.0 CloudKit fetchDatabaseChangesCompletionBloc

发布时间:2020-12-14 17:44:08 所属栏目:百科 来源:网络整理
导读:我跟随 WWDC Session about CloudKit.在这里,有这个代码剪断: let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: privateDatabaseChangeToken)//(...)changesOperation.fetchDatabaseChangesCompletionBlock = { (newTok
我跟随 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也会出现这个错误:

Cannot assign value of type ‘(CKServerChangeToken?,Bool,NSError?) -> Void’ to type ‘((CKServerChangeToken?,Error?) -> Void)?’

我正在使用XCode 8.0 Beta 4,目标是iOS 10,以防这应该是编译器错误.

解决方法

在Beta 4 [需要引证]中,实施了快速演进提议 SE-0112,影响了错误处理.

这里重要的一点是,Objective-C NSError类型在Swift中作为Error(以前的ErrorProtocol)类型而不是NSError导入.

只需更新您的类型注释:

changesOperation.fetchDatabaseChangesCompletionBlock = {
    (newToken: CKServerChangeToken?,error: Error?) -> Void in
    // ...
}

作为旁注,您实际上可以完全省略参数类型:

changesOperation.fetchDatabaseChangesCompletionBlock = { newToken,more,error in
    // ...
}

对于错误处理,我可以告诉传递的错误通常是CKError,这是一个新的(?)结构,它封装了旧NSError上userInfo字典的所有(?).

changesOperation.fetchDatabaseChangesCompletionBlock = { newToken,error in
    guard error == nil else {
        if let ckerror = error as? CKError {
            // ... Handle the CKError
        }
        return
    }
    // ... Do something useful
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读