swift- 无法将类型 '[Int]' 的值转换为预期的参数类型 '[_]'

标签 swift generics swift-extensions

我正在尝试实现一个 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 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)

另请注意,我已为 key 添加了Hashable 要求。

关于swift- 无法将类型 '[Int]' 的值转换为预期的参数类型 '[_]',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36553852/

相关文章:

swift - 数组的通用扩展不起作用

swift - 您是否需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?

iOS swift 3 : Convert "yyyy-MM-dd' T'HH:mm:ssZ"format string to date object

swift - 测试iOS APP中不显示插页式广告

java - 创建一个泛型类,其类型参数仅限于某个父类(super class)

java - 抽象递归泛型导致绑定(bind)不匹配

objective-c - 在 Swift 扩展文件中访问 Obj-C 属性

ios - 通过 NSDate 查找数组索引?

Swift 自定义 flatMap 实现导致错误 Generic parameter could not be inferred

swift - 扩展函数要求返回类型而不是参数