Bridging-header 是不是有可能将 (void (^)(NSError *))block (ObjC) 变成块:() throws -> () (Swift)?

Posted

技术标签:

【中文标题】Bridging-header 是不是有可能将 (void (^)(NSError *))block (ObjC) 变成块:() throws -> () (Swift)?【英文标题】:Is it possible that Bridging-header turns (void (^)(NSError *))block (ObjC) into block: () throws -> () (Swift)?Bridging-header 是否有可能将 (void (^)(NSError *))block (ObjC) 变成块:() throws -> () (Swift)? 【发布时间】:2018-03-21 14:36:57 【问题描述】:

我有

OBJC:

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

斯威夫特:

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()

有可能吗?谢谢大家!

【问题讨论】:

***.com/questions/49324917/… 可能重复。 【参考方案1】:

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

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

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

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

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

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

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

更新:

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

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

【讨论】:

“很可能 (NSError **) to throwable 约定从未为块实现”我正是在这种情况下!是否可以更改 ObjC 方法的签名?也许添加一些子句,例如 NS_SWIFT_ ?

以上是关于Bridging-header 是不是有可能将 (void (^)(NSError *))block (ObjC) 变成块:() throws -> () (Swift)?的主要内容,如果未能解决你的问题,请参考以下文章

将 CocoaPods 更新到 0.36.x 及以上版本后如何引用 Bridging-Header.h 中的头文件?

预计“myproj”-Bridging-Header.swift 中会出现类型错误

Bridging-Header.h 文件和错误“使用未声明的类型...”

XCode 7.3 破坏了 Bridging-Header.h?

XCode 7.3 破坏了 Bridging-Header.h?

Swift Bridging-Header Objective-C presentViewController