获得SequenceType的前n个元素的优雅方式

mis*_*ake 5 swift

是否有一种优雅的方式(想想单行)来获得SequenceTypeSwift 的前n个元素?

我当然可以编写一个for循环,它在n个元素之后终止但是有点笨重.

还要注意,解决方案应该能够处理无限序列.

DeF*_*enZ 13

这不是什么mySequence.prefix(numberOfElements)呢?


Rob*_*ier 2

在 Swift 2 中,您可以将其创建为扩展:

extension SequenceType {
    func take(n: Int) -> [Generator.Element] {
        var result: [Generator.Element] = []
        var g = self.generate()
        for _ in 1...n {
            if let next = g.next() {
                result.append(next)
            } else {
                break
            }
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Swift 1 中,它必须写成一个函数:

func take<Seq: SequenceType>(n: Int, xs: Seq) -> [Seq.Generator.Element] {
    var result: [Seq.Generator.Element] = []
    var g = xs.generate()
    for _ in 1...n {
        if let next = g.next() {
            result.append(next)
        } else {
            break
        }
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)

请注意,无论哪种情况,都不会指定如果多次SequenceType调用会发生什么情况。generate()它可以返回相同的值(如在 中Array)。它可以返回不同的值(如在音频数据流中)。它根本无法返回任何内容。因此 的调用者take()可能需要一些关于它对序列的影响的特殊知识。