gpt4 book ai didi

ios - NSKeyedUnarchiver 错误处理 - 防止 Swift 崩溃

转载 作者:IT王子 更新时间:2023-10-29 05:19:40 24 4
gpt4 key购买 nike

由于 Swift 目前没有 try-catch,我应该如何防止这行代码中的错误数据导致崩溃?

var myObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as MyClass

更新

我在 Playground 上创建了一个非常简单的案例用于演示。假设我们不知道 data 中有什么,我怎样才能在第二行捕获 SIGABRT?有没有办法检查以确保在调用 unarchiveObjectWithData 之前可以取消归档 NSData 对象?

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

最佳答案

我认为目前最好的选择是,在 Apple 更新 NSKeyedUnarchiver 的实现以不使用异常或向 Swift 添加异常支持之前,您将不得不使用 Objective-C 包装器来 try catch 。

你可以在这里看到一个包装器的例子: https://medium.com/swift-programming/adding-try-catch-to-swift-71ab27bcb5b8

基本上,您可以引入单个 Objective-C 函数或类,以允许您使用 Swift 中的 try-catch block 。我喜欢将上面的示例实现为初始化程序,以使其在 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
)

关于ios - NSKeyedUnarchiver 错误处理 - 防止 Swift 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25860169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com