Objective c 如何在iOS swift中将NSDictionary作为返回类型处理?
我试图将现有的、正在工作的objective c应用程序转换为swift,但我有点被“闭包”绊倒了。下面是旧的工作目标c块,它从web服务返回一个值: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) {
- (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
})