Array.filter比循环便宜吗?

时间:2016-03-31 16:42:13

标签: arrays swift

filter中有Array个功能。我想它比使用loop之类的for更便宜。

如果是这样,为什么?

2 个答案:

答案 0 :(得分:7)

现在Swift开源的很酷的事情是我们可以自己验证。 Here's the current source code for Sequence.filter(请注意,它已使用新名称SequenceIterator; SequenceTypeGeneratorType将在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。

由于类型安全性和可预测性,可能会有一些编译器优化,但根据这个:根据您的实现,您的性能可能会有所不同:

enter link description here