Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock Error

Estoy siguiendo una session de WWDC sobre CloudKit . En esto, se cortó este código:

let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: privateDatabaseChangeToken) //(...) changesOperation.fetchDatabaseChangesCompletionBlock = { (newToken: CKServerChangeToken?, more: Bool, error: NSError?) -> Void in // error handling here self.shanetworkingDBChangeToken = newToken // cache new token self.fetchZoneChanges(callback) // using CKFetchRecordZoneChangesOperation } 

Aunque el código se copió exactamente de las diapositivas, XCode derramó este error:

No se puede asignar un valor de tipo '(CKServerChangeToken ?, Bool, NSError?) -> Void' para escribir '((CKServerChangeToken ?, Bool, Error?) -> Void)?'

Estoy usando XCode 8.0 Beta 4 y el objective es iOS 10, en caso de que este sea un error de compilation.

En Beta 4 [cita requerida] , se implementó la propuesta de evolución rápida SE-0112 , que afecta el event handling errores.

El bit importante aquí es que los types Objective-C NSError se importan en Swift como tipo de Error (antes ErrorProtocol ) en lugar de NSError .

Simplemente actualiza tu anotación de tipo:

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

Como nota al margen, puede omitir por completo los types de parameters:

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

Para el event handling errores, por lo que puedo decir, el error que se pasa a menudo es un CKError , que es un nuevo (?) Struct que encapsula todos (?) userInfo dictionary userInfo en el antiguo NSError .

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