泛型 – 你能扩展具有特定约束的泛型类(例如数组)吗?

我想扩展Array类,但仅限于符合SequenceType协议的元素.

我想写的代码/我认为合理的代码是:

extension Array {
    func flatten<T: SequenceType>() -> [T.Generator.Element] {
        var result = [T.Generator.Element]() // *** [2]

        for seq: T in self { // *** [1]
            for elem in seq {
                result += [elem]
            }
        }

        return result
    }
}

但是,Swift似乎创建了两个版本的T.我假设一个来自普通的Array声明,另一个来自我的方法的尝试约束.

特别是,这意味着line [1]给出了可爱的错误’T’不能转换为’T’.

类似地,[2]处的行失败,因为在该上下文中,Swift不会将T识别为具有.Generator成员(尽管声明中的返回类型注释有效).

我已经尝试了许多其他公式(包括使用,例如T,其中T:SequenceType),但我似乎无法找到表达这种约束的方法.
这可能吗,还是我在错误的树上吠叫?

最佳答案
作为你的问题的评论者已经说过,答案是否定的.但是,从Swift标准库的组织中可以清楚地看出,不建议将专用泛型函数编写为方法. (我怀疑随着Swift类型系统的发展,它会发生变化.)例如,请注意,没有包含Swift本机数组类型的方法.相反,它被实现为全局函数,因为要求元素是Equatable.这正是因为您遇到的限制:无法在方法中专门化封闭类的泛型类型参数,无论它是否为扩展. (在我看来,这是一个真正不幸的限制.)

因此,正如Swift目前所说的那样,我将通过使用join来“实现”变平,例如join([],arrayOfArrays).

转载注明原文:泛型 – 你能扩展具有特定约束的泛型类(例如数组)吗? - 代码日志