【发布时间】:2014-07-13 16:17:37
【问题描述】:
我正在尝试将现有的、可工作的目标 c 应用程序转换为 swift,但我对“闭包”感到有些困惑。这是从 Web 服务返回值的旧工作目标 c 块:
- (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 is not a subtype of '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)
我们能够让它工作。但是当我们尝试添加闭包时,它开始抛出相同的原始错误。
【问题讨论】:
-
你试过用 NSDictionary 替换 Dictionary
吗? -
@Eugene 是的,我也试过 Dictionary
。我很确定在 swift 中必须明确声明类型,除非它们很容易被暗示。不过我可能是错的
标签: objective-c xcode swift