【问题标题】:Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock ErrorSwift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误
【发布时间】: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,以防这应该是编译器错误。

【问题讨论】:

    标签: ios xcode cloudkit swift3


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多