这个问题源于@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))
}
的全部?
------编辑:进一步研究------
我确实了解何时使用Sequence
,while let
并孤立地强制展开的原因。这个问题关系到为什么在这种情况下只使用一种以上的方法是最优的。
更令人困惑的是,在查看更多Apple代码时,您会发现for _ in
使用filter
来遍历其元素,而reduce使用while let
而不是创建迭代器
这么多谜团!