如何将一个以闭包作为参数的函数桥接到 objc

Posted

技术标签:

【中文标题】如何将一个以闭包作为参数的函数桥接到 objc【英文标题】:how do I bridge a function taking a closure as a parameter to objc 【发布时间】:2014-06-05 15:30:28 【问题描述】:

我有

func verifyEmail(let email: String, let completionHandler:(Bool) -> Void) -> Bool

在我的 (swift) 框架中

将其暴露为

FOUNDATION_EXPORT BOOL verifyEmail(NSString *email, void (^completionHandler)(BOOL verificationResult));

在我的框架伞头

试图这样称呼它

verifyEmail(@"dfs", ^(BOOL verificationResult) 
    NSLog(@"objc: using sdk v%f", whateverSdkVersionNumber);
);

在目标 c 示例代码中导致链接错误: 架构 arm64 的未定义符号: “_verifyEmail”,引用自: -ObjCExample.o 中的[ObjCExample 验证] ld: 未找到架构 arm64 的符号

与导出的其他函数相同,但如果我可以映射闭包 到块或任何我肯定会修复其余部分的东西:^)

已解决:将全局变量转换为类 func()s

【问题讨论】:

【参考方案1】:

您无法访问在您的 Objective-C 代码中在全局范围内声明的 Swift 函数。每documentation:

只要与 Objective-C 兼容,您就可以访问标有 @objc 属性的类或协议中的任何内容。这不包括仅 Swift 的功能,例如此处列出的功能:

泛型 元组 Swift 中定义的枚举 Swift 中定义的结构 Swift 中定义的***函数 Swift 中定义的全局变量 Swift 中定义的类型别名 Swift 风格的可变参数 嵌套类型

在您的伞形标题中包含FOUNDATION_EXPORT ... 仅公开函数的定义,符号本身并未移植到Objective-C。

【讨论】:

确实,我只是添加了一个多余的 @objc 类并添加了一个类 func,它立即在生成的 swift->objc 桥接头中导出。谢谢! 无类型甚至显式 Int 类型的 swift 枚举似乎没有被导出(安东打破了桌子)

以上是关于如何将一个以闭包作为参数的函数桥接到 objc的主要内容,如果未能解决你的问题,请参考以下文章

如何通过原始指针将闭包作为参数传递给 C 函数?

Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )

Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )

Kotlin函数 ⑨ ( Kotlin 语言中的闭包概念 | Java 语言中函数作为参数的替代方案 )

回调函数和闭包

C ++:将成员函数作为普通函数指针传递的闭包