我正在一个使用Objective-C框架的新项目中,所有新代码都在中Swift
。我遇到了一个有趣的兼容性问题。问题就来了与夫特2.0,其中的任何方法objective-c
,它返回一个BOOL
与需要一个NSError
参数被转换为一种方法,其返回Void
并throws
在Swift
。这种翻译的一个例子NSManagedObjectContext
是Swift中现在使用的save方法:
public func save() throws
从Swift调用代码并且实现也在Swift中时,这不是问题。
我面临的问题是我无法(或不应该)在Objective-C中遵循相同模式的框架。在这种情况下,我实现的是objective-c
协议中定义的方法,在中实现时Swift
,使编译器满意的唯一方法是返回Void并抛出一些东西,当objective-c
调用我的方法时,它会在内部捕获错误并返回值变为NO
,这是我想要的行为。
但是现在NSError
那可以告诉我发生了什么事,是nil,并且似乎没有办法从Swift进行设置,因为它甚至没有传入参数,并且遵守协议的唯一方法是将其取出。我不仅在抛出的异常中看不到该消息,而且现在也看不到NSError
。我只知道呼叫失败,但是没有任何消息记录/显示失败原因,或者在某些失败条件下重试。
我一直在寻找一种Objective-c可以桥接ErrorType
至NSError
但根本找不到任何东西的方法。就像在内部捕获一样,ErrorType
并将返回值设置为NO。
有没有一种方法可以解决而无需更改Objective-C协议定义?
给定协议定义
@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);
}
}
因此,协议方法是在Objective-C还是Swift中实现都没有关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句