【问题标题】: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()
}

有可能吗?谢谢大家!

【问题讨论】:

标签: objective-c swift closures


【解决方案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_ ?
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 2016-04-19
  • 1970-01-01
  • 2023-03-29
  • 2016-01-02
  • 1970-01-01
  • 2020-09-10
  • 2015-01-25
相关资源
最近更新 更多