我正在尝试将现有的,工作的客观c应用程序转换为swift,并且我正在通过“闭包”稍微绊倒。这是旧的工作目标c块,它从Web服务返回一个值:
- (IBAction)didTapSayHiButton {
[self.meteor callMethodName:@"sayHelloTo" parameters:@[self.username.text] responseCallback:^(NSDictionary *response, NSError *error) {
NSString *message = response[@"result"];
[[[UIAlertView alloc] initWithTitle:@"Meteor Todos" message:message delegate:nil cancelButtonTitle:@"Great" otherButtonTitles:nil] show];
}];
}
所以在这里,我要么得到一本字典或回复。它有效。 这就是我试图用swift来解决这个问题的方法(方法略有不同):
@IBAction func sayHi(sender : AnyObject) {
var params = [
"name": "Scotty"
]
meteor.callMethodName("sayHi", parameters: params, responseCallback: {
(response: Dictionary<String, String>, error: NSError) in
println("the name recieved back is: \(response)")
})
}
我在xCode中遇到的错误:“NSDictionary不是'Dictionary'的子类型”
通过快速阅读本书后,这是我能做出的最好的教育尝试。我尝试了一些其他的东西,但每个都导致了另一种错误。
如何使用swift进行此操作?
修改:我也尝试过使用Dictionary
和Dictionary<String, String>
我还应该注意到我正在使用桥接头来访问目标c代码(objectiveDDP)。 callMethodNamed
写在目标c中,如下所示:https://github.com/boundsj/ObjectiveDDP/blob/master/ObjectiveDDP/MeteorClient.h#L47
更新:将方法更改为:
meteor.callMethodName("sayHi", parameters:["scotty"] , responseCallback:nil)
我们能够让它发挥作用。但是我们尝试在闭包中添加第二个,它开始抛出相同的原始错误。
答案 0 :(得分:1)
尝试从使用Swift字典更改为显式使用NSDictionary:
@IBAction func sayHi(sender : AnyObject) {
var params: NSDictionary = [
"name": "Scotty"
]
meteor.callMethodName("sayHi", parameters: params, responseCallback: {
(response: NSDictionary!, error: NSError) in
println("the name recieved back is: \(response)")
})
}
答案 1 :(得分:0)
在这种特殊情况下,技巧是完全省略闭包的参数类型,让编译器弄明白。经过一段时间的搜索后,我找到了this post,这使我找到了解决方案。
meteor.callMethodName("sayHi", parameters:["scotty"] , responseCallback: {
response, error in
let me:String = response["result"] as String!
println("called back \(me)")
})
如果您不担心访问闭包参数,显然您也可以使用下划线完全忽略它们:
meteor.callMethodName("sayHi", parameters:["scotty"] , responseCallback: {
_ in
// Do something here
})