gpt4 book ai didi

objective-c - 桥接头是否有可能将 (void (^)(NSError *))block (ObjC) 变成 block : () throws -> () (Swift)?

转载 作者:行者123 更新时间:2023-11-30 11:39:28 25 4
gpt4 key购买 nike

我有

对象:

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

环球银行金融电信协会:

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

我宁愿

    try? test.doSomething { }

我希望桥接 header 将函数转换为

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

try block()
}

这可能吗?感谢大家!

最佳答案

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

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

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

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

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

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

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

更新:

我认为你不能在 Objective-C 中声明 Swift 抛出 block 。如果您采取相反的方式,并在 Swift 中声明所需的方法签名,您将看到编译器提示它无法在 Objective-C 中表示。

Compiler error

很可能 (NSError **) to throwable 约定从未在 block 中实现。

关于objective-c - 桥接头是否有可能将 (void (^)(NSError *))block (ObjC) 变成 block : () throws -> () (Swift)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49409191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com