如何将一个以闭包作为参数的函数桥接到 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 兼容,您就可以访问标有
泛型 元组 Swift 中定义的枚举 Swift 中定义的结构 Swift 中定义的***函数 Swift 中定义的全局变量 Swift 中定义的类型别名 Swift 风格的可变参数 嵌套类型@objc
属性的类或协议中的任何内容。这不包括仅 Swift 的功能,例如此处列出的功能:
在您的伞形标题中包含FOUNDATION_EXPORT ...
仅公开函数的定义,符号本身并未移植到Objective-C。
【讨论】:
确实,我只是添加了一个多余的 @objc 类并添加了一个类 func,它立即在生成的 swift->objc 桥接头中导出。谢谢! 无类型甚至显式 Int 类型的 swift 枚举似乎没有被导出(安东打破了桌子)以上是关于如何将一个以闭包作为参数的函数桥接到 objc的主要内容,如果未能解决你的问题,请参考以下文章
Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )
Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )