Objective-c代码的Swift 3闭包语法

时间:2016-09-23 17:40:58

标签: swift closures swift3

我使用的库暴露了以下Objective-c方法:

- (void)signIn:(NSString *)username  password:(NSString *)password completion:(void (^)(User *user, NSError *error))completion;

我想像swift 3这样调用这个方法:

sign(in: "abc",  password: "def") { (user: User?, error: NSError?) -> Void in
    // ...
}

编译器引发以下错误:

  

无法转换类型'(User?,NSError?) - >的值虚空'预期参数类型'((用户?,错误?) - > Void)!'

在这个例子中我缺少什么?

2 个答案:

答案 0 :(得分:2)

当您在Xcode中查看库的标题时,点击Related Item弹出菜单(编辑器左上角的四个方块图标),然后选择Generated Interface。这将向您展示ObjC代码的Swift接口,包括该闭包参数的类型签名。

最有可能的是,它类似于@escaping (user: User?, error: Error?) -> Void。但这只是我看到它的猜测 - 请务必阅读生成的界面。

请注意:

  • 假设导入的闭包为@escaping。 (但是,当您创建一个传递给函数的闭包时,您不必在使用站点写入它。)
  • NSError指针通常被翻译为Error协议引用。
  • 参数类型是导入为可选还是非可选取决于ObjC文件中的可空性(或NS_ASSUME_NONNULL)注释。

答案 1 :(得分:0)

Xcode的自动完成功能可以为您提供很多帮助。从弹出菜单中选择功能,按Tab键获取功能签名,再点击几个Tabs,直到到达completion参数,然后按Enter键。这就是XCode给我的东西:

instance.sign(in: String!, password: String!) { (User?, Error?) in
    // code
}

所以你的闭包语法就像:

instance.sign(in: String!, password: String!) { user, error in
    // code
}