Generics 您能用特定约束扩展泛型类(例如数组)吗?

Generics 您能用特定约束扩展泛型类(例如数组)吗?,generics,swift,Generics,Swift,我想扩展数组类,但仅限于符合SequenceType协议的元素 我想写的代码/我认为合理的代码是: extension Array { func flatten<T: SequenceType>() -> [T.Generator.Element] { var result = [T.Generator.Element]() // *** [2] for seq: T in self { // *** [1] f

我想扩展
数组
类,但仅限于符合
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
    }
}
扩展数组{
func flatte()->[T.Generator.Element]{
var result=[T.Generator.Element]()/***[2]
对于seq:T,在self{//***[1]
对于下列要素:{
结果+=[elem]
}
}
返回结果
}
}
然而,Swift似乎创建了两个版本的
T
。我假设一个来自正常的
数组
声明,另一个来自我的方法上尝试的约束

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

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

我尝试了许多其他公式(包括使用,例如,
T,其中T:SequenceType
),但我似乎找不到表达这种约束的方法。
这是可能的,还是我找错了方向?

正如你的问题的评论者所说,答案是否定的。然而,从Swift标准库的组织结构中可以清楚地看出,不鼓励编写专门的泛型函数作为方法。(我怀疑这会随着Swift的类型系统的发展而改变。)例如,请注意Swift的本机数组类型没有
contains
方法相反,它是作为一个全局函数实现的,因为要求元素是可均衡的。这正是因为您遇到的限制:不可能在方法中专门化封闭类的泛型类型参数,无论它是否是扩展。(在我看来,这是一个非常不幸的限制。)


因此,根据Swift目前的情况,我将通过使用
join
“实现”
flatten
,例如,
join([],arrayOfArrays)
,使用Swift 2,现在这是可能的:

extension SequenceType where Generator.Element : SequenceType {
    func flatten() -> [Generator.Element.Generator.Element] {
        var result: [Generator.Element.Generator.Element] = []
        for seq in self {
            result += seq
        }
        return result
    }
}

[[1,2,3],[],[2,4,5]].flatten() // [1, 2, 3, 2, 4, 5]

请注意,现在库中已经有了flatMap,这个特定函数就不再那么重要了。

我希望如此,但我不这么认为。另一种选择是
func flatte(array:[t])->[t.Generator.Element]{…
@jtbandes-我实际上也这么认为,但尝试该函数的通用版本会使我的编译器崩溃><()从架构的角度来看,这是一个公平的观点。他们似乎决定追求一致性(又称Python),而不是易用性/可读性(Ruby),这是很公平的。