"Extra argument 'foo' in call" 或“'[NSObject : AnyObject]!'不是 'Dictionary<Key, Value>' 的子类型”
"Extra argument 'foo' in call" OR "'[NSObject : AnyObject]!' is not a subtype of 'Dictionary<Key, Value>'"
我已经阅读了我能找到的所有 "extra argument in call" 帖子,但我仍然反对这个帖子。我有一个看起来像这样的方法:
// 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
所以我尝试为参数提供更好的类型匹配 ([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>'
我犯了什么愚蠢的错误? :)
我认为您的第二个错误是抱怨完成块的类型,而不是 params
参数的类型。这对我有用:
GenericWebService.get("", params: ["foo": "bar"], completion: {
(a: [NSObject: AnyObject]!, b: NSError!) in
})
问题出在闭包参数上。如果您使参数完全匹配,它会起作用:
GenericWebService.get("", params: ["foo":"bar"]) {
(responseDictionary: [NSObject:AnyObject]!, connectionError: NSError!) -> Void in
// foo
}
但与其明确地键入它们,不如让 Swift 为您完成可能更容易:
GenericWebService.get("", params: ["foo":"bar"]) {
responseDictionary, connectionError in
// foo
}
在操场上,我发现这个语法也能正确编译:
GenericWebService.get("", params: ["foo" : "bar"], completion: {
(responseDictionary _: [NSObject : AnyObject]!, connectionError _: NSError!) -> Void in
})
我已经阅读了我能找到的所有 "extra argument in call" 帖子,但我仍然反对这个帖子。我有一个看起来像这样的方法:
// 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
所以我尝试为参数提供更好的类型匹配 ([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>'
我犯了什么愚蠢的错误? :)
我认为您的第二个错误是抱怨完成块的类型,而不是 params
参数的类型。这对我有用:
GenericWebService.get("", params: ["foo": "bar"], completion: {
(a: [NSObject: AnyObject]!, b: NSError!) in
})
问题出在闭包参数上。如果您使参数完全匹配,它会起作用:
GenericWebService.get("", params: ["foo":"bar"]) {
(responseDictionary: [NSObject:AnyObject]!, connectionError: NSError!) -> Void in
// foo
}
但与其明确地键入它们,不如让 Swift 为您完成可能更容易:
GenericWebService.get("", params: ["foo":"bar"]) {
responseDictionary, connectionError in
// foo
}
在操场上,我发现这个语法也能正确编译:
GenericWebService.get("", params: ["foo" : "bar"], completion: {
(responseDictionary _: [NSObject : AnyObject]!, connectionError _: NSError!) -> Void in
})