swift- 无法将类型“[Int]”的值转换为预期的参数类型“[_]”
swift- Cannot convert value of type '[Int]' to expected argument type '[_]'
我正在尝试实现一个 zip 函数作为 Array 的扩展,我打算像这样使用它:
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
myKeys.zip(myVars) // ["a":1,"b":2,"c":3]
这是我的尝试:
extension Array {
public func zip<T,U>(vals: [U]) -> [T:U] {
var dict: [T:U] = Dictionary()
for (i,key) in self.enumerate() {
if let k = key as? T {
dict[k] = vals[i]
}
}
return dict
}
}
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
myKeys.zip(myVars) // ERROR: Cannot convert value of type '[Int]' to expected argument type '[_]'
在最后一行,我收到一个我不完全理解的错误。我理解这意味着我正在传递一个 [Int] 并且它期待一个 [_]。但是这里不 _ 只是一个通用的占位符吗?为什么它会抱怨收到 [Int]?
此外,如果我将 zip 实现为 class 函数,它没有问题:
class func zip<T,U>(keys keys: [T], vals: [U]) -> [T:U] {
var dict: [T:U] = Dictionary()
for (i,key) in keys.enumerate() {
dict[key] = vals[i]
}
return dict
}
zip(keys: myKeys,vals: myVals) // ["a":1,"b":2,"c":3]
如有任何想法,我们将不胜感激!
注意 Array
已经有一个关联类型,叫做 Element
,所以不需要声明 T
。您的代码的问题是您无法真正将 Element
转换为未定义类型 T
(T
与数组元素类型之间没有联系)。
extension Array where Element: Hashable {
public func zip<U>(vals: [U]) -> [Element: U] {
var dict: [Element: U] = Dictionary()
for (i, key) in self.enumerate() {
dict[key] = vals[i]
}
return dict
}
}
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
let map = myKeys.zip(myVars)
print(map)
另请注意,我已添加 Hashable
对密钥的要求。
我正在尝试实现一个 zip 函数作为 Array 的扩展,我打算像这样使用它:
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
myKeys.zip(myVars) // ["a":1,"b":2,"c":3]
这是我的尝试:
extension Array {
public func zip<T,U>(vals: [U]) -> [T:U] {
var dict: [T:U] = Dictionary()
for (i,key) in self.enumerate() {
if let k = key as? T {
dict[k] = vals[i]
}
}
return dict
}
}
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
myKeys.zip(myVars) // ERROR: Cannot convert value of type '[Int]' to expected argument type '[_]'
在最后一行,我收到一个我不完全理解的错误。我理解这意味着我正在传递一个 [Int] 并且它期待一个 [_]。但是这里不 _ 只是一个通用的占位符吗?为什么它会抱怨收到 [Int]?
此外,如果我将 zip 实现为 class 函数,它没有问题:
class func zip<T,U>(keys keys: [T], vals: [U]) -> [T:U] {
var dict: [T:U] = Dictionary()
for (i,key) in keys.enumerate() {
dict[key] = vals[i]
}
return dict
}
zip(keys: myKeys,vals: myVals) // ["a":1,"b":2,"c":3]
如有任何想法,我们将不胜感激!
注意 Array
已经有一个关联类型,叫做 Element
,所以不需要声明 T
。您的代码的问题是您无法真正将 Element
转换为未定义类型 T
(T
与数组元素类型之间没有联系)。
extension Array where Element: Hashable {
public func zip<U>(vals: [U]) -> [Element: U] {
var dict: [Element: U] = Dictionary()
for (i, key) in self.enumerate() {
dict[key] = vals[i]
}
return dict
}
}
let myKeys = ["a","b","c"]
let myVars = [1,2,3]
let map = myKeys.zip(myVars)
print(map)
另请注意,我已添加 Hashable
对密钥的要求。