对于In vs While Let:为什么Swift的地图实现会如此?

时间:2019-04-25 21:31:23

标签: swift functional-programming

这个问题源于@twostraws video,关于苹果如何实现Sequence.map

这是苹果的做法:

@inlinable
  public func map<T>(
    _ transform: (Element) throws -> T
  ) rethrows -> [T] {

    let initialCapacity = underestimatedCount
    var result = ContiguousArray<T>()
    result.reserveCapacity(initialCapacity)

    var iterator = self.makeIterator()

    // Add elements up to the initial capacity without checking for regrowth.
    for _ in 0..<initialCapacity {
      result.append(try transform(iterator.next()!))
    }
    // Add remaining elements, if any.
    while let element = iterator.next() {
      result.append(try transform(element))
    }
    return Array(result)
  }

我了解在进行附加聚会之前,underestimatedCount可以很好地用于保留阵列的容量,但是我不了解for _ in和{{1 }}在底部循环。

为什么这种循环实现比简单地调用更优化:

while let

while let element = iterator.next() { result.append(try transform(element)) } 的全部?

------编辑:进一步研究------

我确实了解何时使用Sequencewhile let并孤立地强制展开的原因。这个问题关系到为什么在这种情况下只使用一种以上的方法是最优的。

更令人困惑的是,在查看更多Apple代码时,您会发现for _ in使用filter来遍历其元素,而reduce使用while let而不是创建迭代器

这么多谜团!

0 个答案:

没有答案