cuốn sách gpt4 ai đã làm

objective-c - 如何调用接受 block 字典作为 Swift 参数的 objective-c 函数?

In lại Tác giả: Hồ Xil 更新时间:2023-11-01 01:16:24 25 4
mua khóa gpt4 Nike

我的 objective-c 文件中有一个函数(比如 MyBlockExecutor 类):

+ (void) runBlockFromDictionary: (NSDictionary*) blocksDict andKey: (NSString*) key
{
if ( [blocksDict objectForKey: key] != nil )
{
((MyBlock)[blocksDict objectForKey: key])();
}
}

现在,我想从 Swift 调用这个函数。这是我的快速调用:

MyBlockExecutor.runBlock(from: [
"key1":{ ()->Void in
print("block for key1 called")
}
], andKey: "key1")

这会使我的应用程序崩溃。我在这一行收到 EXC_BAD_ACCESS 错误:

((MyBlock)[blocksDict objectForKey: key])();

不过,从 Objective-C 调用相同的函数工作得很好。另外,我将 MyBlock 定义为:

typedef void (^MyBlock)(); //defined in MyBlockExecutor.h file

我该如何解决?

编辑:我对 objective-c 函数的变化持开放态度,我只是需要以某种方式将闭包集合从 swift 传递到我的 objective-c 函数并运行该 block 。

câu trả lời hay nhất

您可以使用与 Swift blocks not working 中类似的方法: 用 @convention(block) 注释 block 使用 Objective-C block 调用约定,并(显式)强制转换在将其放入字典之前将其添加到 Bất kỳ đối tượng nào 中:

let myBlock: @convention(block) () -> Void = {
print("block for key1 called")
}

let dict = ["key1": myBlock as AnyObject]

MyBlockExecutor.runBlock(from: dict, andKey: "key1")

这在我的测试中按预期工作。

它也类似于奎因的“爱斯基摩人!”建议在 the Apple developer forum作为一种方法传递闭包(在 Swift 中定义)作为 Objective-C 兼容通过指针对象,只是我替换了 unsafeBitCast通过更简单的作为 AnyObject.

您也可以内联编写所有内容:

MyBlockExecutor.runBlock(from: ["key1": {
print("block for key1 called")
} as @convention(block) () -> Void as AnyObject
], andKey: "key1")

或者定义一个辅助函数:

func objcBlock(from block: @convention(block) () -> Void) -> AnyObject {
return block as AnyObject
}

MyBlockExecutor.runBlock(from: ["key1": objcBlock {
print("block for key1 called")
}], andKey: "key1")

关于objective-c - 如何调用接受 block 字典作为 Swift 参数的 objective-c 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46224806/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress