Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在iOS swift中将NSDictionary作为返回类型处理?_Objective C_Xcode_Swift - Fatal编程技术网

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

Objective c 如何在iOS swift中将NSDictionary作为返回类型处理?,objective-c,xcode,swift,Objective C,Xcode,Swift,我试图将现有的、正在工作的objective c应用程序转换为swift,但我有点被“闭包”绊倒了。下面是旧的工作目标c块,它从web服务返回一个值: - (IBAction)didTapSayHiButton { [self.meteor callMethodName:@"sayHelloTo" parameters:@[self.username.text] responseCallback:^(NSDictionary *response, NSError *error) {

我试图将现有的、正在工作的objective 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(发送方:AnyObject){
变量参数=[
“姓名”:“斯科蒂”
]
meteor.callMethodName(“sayHi”),参数:params,responseCallback:{
(响应:Dictionary,错误:NSError)在
println(“收到的名称为:\(响应)”)
})
} 
我在xCode中遇到的错误:“NSDictionary不是Dictionary的子类型”

在阅读了swift这本书之后,这是我所能做的最好的尝试。我尝试了其他一些方法,但每种方法都会导致另一种错误

我如何使用swift实现这一点

编辑:我也尝试过只使用
字典
字典

我还应该注意,我正在使用桥接头来访问目标c代码(objectiveDDP)。而
callMethodNamed
是用objective c编写的,如下所示:

更新:通过将方法更改为:

meteor.callMethodName(“sayHi”,参数:[“scotty”],响应Callback:nil)


我们能够让它工作。但是,当我们尝试添加闭包时,它开始抛出相同的原始错误。

尝试从使用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)")
        })
}

在这种特殊情况下,诀窍是完全省略闭包的参数类型,并让编译器解决它。经过一段时间的搜索,我找到了答案

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

你试过用字典代替字典吗?@Eugene是的,我也试过字典。我很确定,在swift中,类型必须显式声明,除非它们可以很容易地隐含。我可能错了,我试过了。这几乎是相同的错误:“'NSDictionary!'不是'NSDictionary'的子类型”,看起来它可能需要一个隐式展开的可选NSDictionary。你试过这个吗?我刚试着加了一个!直到字典的末尾,这似乎消除了错误。但是,我得到了一个类似的错误,所以添加一个!这导致了另一个错误:无法转换表达式的类型字符串!键入字符串!。不知道从哪里来的,从哪里来的?println?不,它只是xCode中的一个错误,在我输入它的时候弹出
    meteor.callMethodName("sayHi", parameters:["scotty"] , responseCallback: {
        _ in
        // Do something here
    })