我有
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()
}
有可能吗?谢谢大家!
答案 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中表示。
很可能(NSError **)的throwable约定从未实现过块。