filter
中有Array
个功能。我想它比使用loop
之类的for
更便宜。
如果是这样,为什么?
答案 0 :(得分:7)
Sequence.filter
(请注意,它已使用新名称Sequence
和Iterator
; SequenceType
和GeneratorType
将在Swift 3中重命名:
/// Returns an `Array` containing the elements of `self`,
/// in order, that satisfy the predicate `includeElement`.
@warn_unused_result
public func filter(
@noescape includeElement: (Iterator.Element) throws -> Bool
) rethrows -> [Iterator.Element] {
var result = ContiguousArray<Iterator.Element>()
var iterator = self.makeIterator()
while let element = iterator.next() {
if try includeElement(element) {
result.append(element)
}
}
return Array(result)
}
它使用while
循环而不是for
循环,可能是因为该代码是在for ... in
之前编写的(尽管我还没有验证)。但是你可以看到它本质上是一个没有特殊优化的简单循环。
答案 1 :(得分:1)
简单地说,是一个循环,它实际上只是使你的代码更清洁的语法糖
let stuff = ["asdf", "asdf", ""]
var things: [String] = []
for item in stuff {
if(!item.isEmpty) {
things.append(item)
}
}
在功能上与:
相同let stuff = ["asdf", "asdf", ""]
var things = stuff.filter{!$0.isEmpty}
6行至1。
由于类型安全性和可预测性,可能会有一些编译器优化,但根据这个:根据您的实现,您的性能可能会有所不同: