我使用的库暴露了以下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)!'
在这个例子中我缺少什么?
答案 0 :(得分:2)
当您在Xcode中查看库的标题时,点击Related Item弹出菜单(编辑器左上角的四个方块图标),然后选择Generated Interface。这将向您展示ObjC代码的Swift接口,包括该闭包参数的类型签名。
最有可能的是,它类似于@escaping (user: User?, error: Error?) -> Void
。但这只是我看到它的猜测 - 请务必阅读生成的界面。
请注意:
@escaping
。 (但是,当您创建一个传递给函数的闭包时,您不必在使用站点写入它。)NSError
指针通常被翻译为Error
协议引用。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
}