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?