&#34;额外的争论&#39; foo&#39;在电话&#34;或者&#34;&#39; [NSObject:AnyObject]!&#39;不是&#39;词典<key,value =“”>&#39;&#34; </key,>的子类型

时间:2015-01-27 20:03:34

标签: objective-c swift nsdictionary

我已经阅读了呼叫中的所有额外参数&#34;我可以找到的帖子,但我还在敲打这个帖子。我有一个看起来像这样的方法:

// Objective-C
+ (void)get:(NSString *)url params:(NSDictionary *)params completion:(NetworkCompletion)completion

// Swift autocomplete
GenericWebService.get(url: String!, params: [NSObject : AnyObject]!, completion: (([NSObject : AnyObject]!, NSError!) -> Void)!)

我在Swift中首次尝试使用此方法看起来像这样......

GenericWebService.get("", params: ["foo":"bar"], completion: {
    (responseDictionary: Dictionary, connectionError: NSError) -> Void in
        // foo
    })

...并产生了错误Extra argument 'params' in call

所以我尝试为params([NSObject:AnyObject])...

提供更好的类型匹配
let params: [NSObject:AnyObject] = ["foo":"bar"]
GenericWebService.getURL("", params: params, completion: {
    (responseDictionary: Dictionary, connectionError: NSError) -> Void in
        // foo
    })

...产生'[NSObject : AnyObject]!' is not a subtype of 'Dictionary<Key, Value>'

我犯了什么愚蠢的错误? :)

3 个答案:

答案 0 :(得分:1)

我认为您的第二个错误是抱怨完成块的类型,而不是params参数的类型。这对我有用:

GenericWebService.get("", params: ["foo": "bar"], completion: {
    (a: [NSObject: AnyObject]!, b: NSError!) in
})

答案 1 :(得分:1)

问题在于闭包参数。如果您使参数完全匹配,则可以正常工作:

GenericWebService.get("", params: ["foo":"bar"]) {
    (responseDictionary: [NSObject:AnyObject]!, connectionError: NSError!) -> Void in
    // foo
}

但是,不是明确地键入它们,只是让Swift为你做这件事可能更容易:

GenericWebService.get("", params: ["foo":"bar"]) {
    responseDictionary, connectionError in
    // foo
}

答案 2 :(得分:0)

在游乐场,我发现这种语法也可以正确编译:

GenericWebService.get("", params: ["foo" : "bar"], completion: {
        (responseDictionary _: [NSObject : AnyObject]!, connectionError _: NSError!) -> Void in
    })