NSKeyedUnarchiver错误处理 - 在Swift中防止崩溃

15

由于Swift当前没有try-catch,我该如何在这行代码中防止坏数据导致崩溃?

var myObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as MyClass

更新

我在游乐场中创建了一个非常简单的示例以进行演示。假设我们不知道data中有什么内容,如何捕获第二行的SIGABRT? 在调用unarchiveObjectWithData之前,是否没有办法检查确保可以对NSData对象进行反归档?

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

我有同样的问题 - 你找到解决方案了吗? - return true
还没有... unarchiveObjectWithData 方法中真的应该接受一个错误引用作为参数,以处理 Objective-C 风格的异常不抛出的情况... 不确定他们在核心库中是如何忽视这个问题的,但唉。 - chasew
1个回答

6
我认为目前最好的选择是,在苹果更新NSKeyedUnarchiver的实现方式,避免使用异常或者在Swift中添加异常支持之前,您需要使用Objective-C包装器来进行try-catch。
你可以在这里看到一个包装器的示例:https://medium.com/swift-programming/adding-try-catch-to-swift-71ab27bcb5b8 基本上,您可以引入一个单个的Objective-C函数或类,使您可以从Swift中使用一个try-catch块。我喜欢将上面的示例实现为初始化程序,以使它在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
)

关于添加此功能的库,请参见此答案:https://dev59.com/-1wY5IYBdhLWcg3wU2XA#34501525 - John Cummings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接