gpt4 book ai didi

objective-c - Swift 2.0 和 objective-c 兼容方法返回带有参数 NSError 的 Bool

转载 作者:可可西里 更新时间:2023-11-01 01:00:04 26 4
gpt4 key购买 nike

我正在开发一个使用 objective-c 框架的新项目,所有新代码都在 Swift 中。我遇到了一个有趣的兼容性问题。问题来自 Swift 2.0,其中 objective-c 中返回 BOOL 并采用 NSError 参数的任何方法都被转换为返回的方法Swift 中的 Voidthrows。这种翻译的一个例子是 NSManagedObjectContext 现在在 Swift 中的保存方法:

public func save() throws

当从 Swift 调用代码并且实现也在 Swift 中时,这不是问题。

我面临的问题是我不能(或不应该)在遵循相同模式的 objective-c 中修改的框架。在这种情况下,我正在实现在 objective-c 协议(protocol)中定义的方法,当在 Swift 中实现它时,让编译器满意的唯一方法是返回void 并抛出一些东西,当 objective-c 调用我的方法时,它在内部捕获错误并且返回值变为 NO,这是我想要的行为。

但是现在告诉我发生了什么的 NSError 是 nil,而且似乎没有办法从 Swift 设置它,因为它甚至没有传入参数,而且唯一的方法遵守协议(protocol)就是把它拿出来。我不仅在抛出的异常中看不到消息,而且现在我也看不到 NSError。我只知道调用失败,但没有任何消息来记录/显示失败原因,或者可能在某些失败条件下重试。

我一直在寻找一种方法,让 Objective-c 可以将 ErrorType 桥接到 NSError 但根本找不到任何东西。就像它在内部捕获 ErrorType 并将返回值设置为 NO 一样。

有什么方法可以解决这个问题,无需更改 objective-c 协议(protocol)定义?

最佳答案

给定一个协议(protocol)定义

@protocol MyProtocol <NSObject>
- (BOOL)myMethod:(NSInteger)x error:(NSError *__autoreleasing *)error;
@end

你可以在 Swift 中实现一个一致的类并抛出一个 NSError:

class SwClass : NSObject, MyProtocol {

func myMethod(x: Int) throws {
if x < 0 {
throw NSError(domain: "my.domain", code: 1234, userInfo: ["error" : "called with negative argument"])
}
}
}

当从 Objective-C 调用时,错误被分配给传递的NSError 变量:

-(void)foo {
SwClass *obj = [[SwClass alloc] init];
NSError *error;
if (![obj myMethod:-3 error:&error]) {
NSLog(@"%@", error);
}
}

因此协议(protocol)方法是否实现并不重要在 Objective-C 或 Swift 中。

关于objective-c - Swift 2.0 和 objective-c 兼容方法返回带有参数 NSError 的 Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583825/

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