Bridging-header是否可能将(void(^)(NSError *))块(ObjC)转换为块:()throws - > ()(斯威夫特)?

时间:2018-03-21 14:36:58

标签: objective-c swift closures

我有

OBJC:

- (void)doSomething:(void (^)(NSError *))block;

(SWIFT):

let test = Test()
   test.doSomething(<#T##block: ((Error?) -> Void)!##((Error?) -> Void)!##(Error?) -> Void#>)

我宁愿

    try? test.doSomething { }

我想将bridging-header转换为

func doSomething(block: () throws -> ()) throws {

    try block()
}

有可能吗?谢谢大家!

1 个答案:

答案 0 :(得分:0)

您的Objective-C方法声明了一个参数,该参数是一个接收NSError对象的块。它基本上宣布了一个回调。

如果你的方法不是异步的,你应该这样声明:

- (BOOL)doSomething:(NSError **)error;

现在该参数是一个指向NSError *对象的指针。如果方法由于某种原因失败,则应为该参数设置适当的错误,如下所示:

if (error != NULL) {
    *error = <an appropriate error>
}

另请注意BOOL返回类型。根据Cocoa约定,调用者应该引用返回类型来确定方法是否失败,而不是测试是否存在NSError *对象。

声明这样的方法将使用throws机制在Swift中公开它。

<强>更新

我认为你不能在Objective-C中声明一个Swift投掷块。如果你反过来,并在Swift中声明你想要的方法签名,你会看到编译器抱怨它不能在Objective-C中表示。

Compiler error

很可能(NSError **)的throwable约定从未实现过块。