【问题标题】:How to handle a NSDictionary as a return type in iOS swift?如何在 iOS swift 中将 NSDictionary 作为返回类型处理?
【发布时间】: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 进行这项工作?

编辑:我也试过只使用DictionaryDictionary&lt;String, String&gt;

我还应该注意,我正在使用桥接头来访问目标 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


【解决方案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)")
        })
}

【讨论】:

  • 刚刚试过。这几乎是相同的错误:“'NSDictionary!'不是“NSDictionary”的子类型”
  • 看起来它可能期待 NSDictionary 的隐式解包选项。你试过吗! ?
  • 我刚刚尝试添加一个!到 NSDictionary 结尾,这似乎清除了错误。但是后来我收到了类似的 NSError 错误,所以添加一个!到最后,导致另一个错误:无法转换表达式的字符串类型!键入字符串!。不知道这是从哪里来的。
  • 这是从哪里来的? println?
  • 不,它只是 xCode 中的一个错误,在我输入它的第二个弹出
【解决方案2】:

在这种特殊情况下,诀窍是完全省略闭包的参数类型,并让编译器自己解决。搜索了一会后,我找到了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
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多