Swift3:泛型扩展中的类型推断

Swift3: type inference inside generic extension

我需要做这样的事情:

extension Array { 
    func flat() -> Element { return self.flatMap { [=10=] } }
}

但是类型推断有问题:

'flatMap' produces '[SegmentOfResult.Iterator.Element]', not the expected contextual result type 'Element'

编辑: 用法示例:

[[1,2],[3,4,5],[6]].flat()

应该产生 [1,2,3,4,5,6] 与以下内容相同:

[[1,2],[3,4,5],[6]].flatMap { [=12=] }

如果你看一下 flatMap(_:) 签名,

extension Sequence {
    // ...
    public func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
    // ...
}

您会看到它 return 是一个 [SegmentOfResult.Iterator.Element],其中 SegmentOfResult 是从您传递给它的函数中 return 得到的类型。这不一定与 Element 相同类型(因为您的扩展是针对 all 数组),这就是您的代码无法编译的原因。

为了使用元素为序列的数组,您需要限制扩展,以便 Element : Sequence.

此外,由于您传递给 flatMap(_:) 的函数是恒等变换(它只是 return 作为输入接收的元素),您需要更改 return 键入 [Element.Iterator.Element](内部元素的数组)。

extension Array where Element : Sequence {
    func flat() -> [Element.Iterator.Element] {
        return self.flatMap { [=11=] }
    }
}

尽管如此,我看不出为什么这不应该是 Sequence:

的扩展
// An extension for a sequence of sequences
extension Sequence where Iterator.Element : Sequence {

    // returns an array of the inner element type (an array of the element of the element)
    func flat() -> [Iterator.Element.Iterator.Element] { 
        return self.flatMap { [=12=] }
    }
}

(但是,我一开始并不认为有必要为此创建扩展 - array.flatMap{[=21=]} 并不冗长!)