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

奥斯卡·戈麦斯(Oscar Gomez)

我正在一个使用Objective-C框架的新项目中,所有新代码都在中Swift我遇到了一个有趣的兼容性问题。问题就来了与夫特2.0,其中的任何方法objective-c,它返回一个BOOL与需要一个NSError参数被转换为一种方法,其返回VoidthrowsSwift这种翻译的一个例子NSManagedObjectContext是Swift中现在使用的save方法:

public func save() throws

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

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

但是现在NSError那可以告诉我发生了什么事,是nil,并且似乎没有办法从Swift进行设置,因为它甚至没有传入参数,并且遵守协议的唯一方法是将其取出。我不仅在抛出的异常中看不到该消息,而且现在也看不到NSError我只知道呼叫失败,但是没有任何消息记录/显示失败原因,或者在某些失败条件下重试。

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

有没有一种方法可以解决而无需更改Objective-C协议定义?

马丁·R

给定协议定义

@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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift 2协议扩展和对Objective-C类型的一致性

来自分类Dev

Swift 2协议扩展和对Objective-C类型的一致性

来自分类Dev

混合Swift和Objective-C

来自分类Dev

initWithDictionary:在Objective-C和Swift中

来自分类Dev

混合Swift和Objective-C

来自分类Dev

initWithDictionary:在Objective-C和Swift中

来自分类Dev

Swift和Objective-C中的CellForRowAtIndexPath

来自分类Dev

Swift 和 Objective-C 之间的 NSInvalidArgumentException

来自分类Dev

Swift 和 Objective-C 之间的 UIGestureRecognizer

来自分类Dev

如何在带有参数的objective-C中实现swift委托方法?

来自分类Dev

带有模块映射的框架内的Objective-C和Swift互操作性

来自分类Dev

在Swift中创建与Objective-C等效的Getter和Setter

来自分类Dev

在WatchKitExtension中混合Swift和Objective-C

来自分类Dev

子类化时混合Objective-C和Swift

来自分类Dev

CocoaPods:将Objective-C和Swift混合使用

来自分类Dev

您在Objective c和Swift中怎么称呼它?

来自分类Dev

Objective-C属性和指向Swift的指针

来自分类Dev

使用swift和objective-c下载文件

来自分类Dev

Objective-C 和 swift 之间的编码,不匹配

来自分类Dev

Swift 或 Objective C 中枚举器和迭代器的区别

来自分类Dev

在 Objective-C 和 Swift 中链接可空块?

来自分类Dev

Swift,NSJSONSerialization和NSError

来自分类Dev

Swift 2 addObserver用于带有object参数的特定textField

来自分类Dev

带有对象参数的特定UITextfield的Swift 2 addObserver

来自分类Dev

Swift 2和Cloudkit的通知

来自分类Dev

Objective-C覆盖具有2个参数的方法

来自分类Dev

带有协议逻辑Swift 2的现有类型和泛型

来自分类Dev

C#和Swift中的RNCryptor,RNCryptorError错误2

来自分类Dev

C#和Swift中的RNCryptor,RNCryptorError错误2

Related 相关文章

热门标签

归档