我跟随
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,以防这应该是编译器错误.
解决方法@H_502_25@
在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
}
这里重要的一点是,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 }