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

时间:2014-06-05 15:30:28

标签: objective-c swift language-interoperability

我有

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

在我的(快速)框架中

将其公开为

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 verify] ld:找不到架构arm64的符号

与导出的其他函数相同但是如果我可以映射闭包 阻止或其他什么我肯定会解决其余问题:^)

已解决:转换后的全局变量到类func()s

1 个答案:

答案 0 :(得分:4)

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

  

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

     
      
  • 泛型
  •   
  • 元组
  •   
  • Swift中定义的枚举
  •   
  • Swift中定义的结构
  •   
  • Swift中定义的顶级函数
  •   
  • Swift中定义的全局变量
  •   
  • Swift中定义的Typealiases
  •   
  • Swift式variadics
  •   
  • 嵌套类型
  •   

在您的伞形标题中包含FOUNDATION_EXPORT ...仅显示函数的定义,符号本身不会移植到Objective-C。