是否有一种优雅的方式(想想单行)来获得SequenceTypeSwift 的前n个元素?
我当然可以编写一个for循环,它在n个元素之后终止但是有点笨重.
还要注意,解决方案应该能够处理无限序列.
在 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()可能需要一些关于它对序列的影响的特殊知识。