Manejo de errores de NSKeyedUnarchiver: evitar el locking en Swift

Dado que Swift actualmente no tiene captura de testing, ¿cómo se supone que debo evitar fallas con datos incorrectos en esta línea de código?

var myObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as MyClass 

ACTUALIZAR

Creé un caso muy simple en un patio de recreo para la demostración. Supongamos que no sabemos qué hay en los data , ¿cómo puedo atrapar el SIGABRT en la segunda línea? ¿No hay forma de verificar para asegurarse de que es posible desarchivar un object NSData antes de llamar a unarchiveObjectWithData ?

 var data = "foo bar".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! if let unarc = NSKeyedUnarchiver.unarchiveObjectWithData(data) { // Execution was interrupted: signal SIGABRT } 

Creo que tu mejor apuesta por ahora, hasta que Apple actualice la implementación de NSKeyedUnarchiver para no usar excepciones o agregar soporte de exception a Swift, tendrá que usar un contenedor Objective-C para intentar capturar.

Puede ver un ejemplo de un contenedor aquí: https://medium.com/swift-programming/adding-try-catch-to-swift-71ab27bcb5b8

Esencialmente, puede introducir una sola function o class de Objective-C que le permitirá usar un bloque de testing y captura de Swift. Me gusta implementar el ejemplo anterior como un inicializador para hacerlo más limpio en Swift:

 // In Objective-C // ---------------------- @interface try: NSObject - (id)initWithTry:(void(^)())try catch:(void(^)(NSException *exception))catch finally:(void(^)())finally; @end @implementation try - (id)initWithTry:(void(^)())try catch:(void(^)(NSException *exception))catch finally:(void(^)())finally { self = [super init]; if (self) { @try { try ? try() : nil; } @catch (NSException *exception) { catch ? catch(exception) : nil; } @finally { finally ? finally() : nil; } } return self; } @end // From Swift (make sure you import the objc header in your bridging header // ---------------------- var data = "foo bar".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! try( try: { () -> Void in if let unarc: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) { // Execution was interrupted: signal SIGABRT println(unarc) } }, catch: { exception in println("Failed to parse data: \(exception)") }, finally: nil )