如何在iOS swift中处理NSDictionary作为返回类型?

时间:2014-07-13 16:17:37

标签: objective-c xcode swift

我正在尝试将现有的,工作的客观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'的子类型”

enter image description here 通过快速阅读本书后,这是我能做出的最好的教育尝试。我尝试了一些其他的东西,但每个都导致了另一种错误。

如何使用swift进行此操作?

修改:我也尝试过使用DictionaryDictionary<String, String>

我还应该注意到我正在使用桥接头来访问目标c代码(objectiveDDP)。 callMethodNamed写在目标c中,如下所示:https://github.com/boundsj/ObjectiveDDP/blob/master/ObjectiveDDP/MeteorClient.h#L47

更新:将方法更改为:

meteor.callMethodName("sayHi", parameters:["scotty"] , responseCallback:nil)

我们能够让它发挥作用。但是我们尝试在闭包中添加第二个,它开始抛出相同的原始错误。

2 个答案:

答案 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
    })