Swift字典中的低估量

时间:2016-08-24 01:10:19

标签: swift dictionary collections

根据文档,Swift的Dictionary类型具有名为underestimatedCount的此属性:

  

小于或等于中的元素数量的值   集合。

任何人都知道为什么维斯特洛斯这被认为是有用的??!

让我感到困惑......

1 个答案:

答案 0 :(得分:5)

摘要:从技术上讲,underestimatedCount属于Sequence,并由CollectionDictionary继承。 Dictionary不会覆盖返回零的默认实现。

查看源代码,似乎underestimatedCount用作指示,以确定在添加新项目时可变集合的增长量。

以下是StringCore.Swift的摘录:

public mutating func append<S : Sequence>(contentsOf s: S)
  where S.Iterator.Element == UTF16.CodeUnit {

...........

  let growth = s.underestimatedCount
  var iter = s.makeIterator()

  if _fastPath(growth > 0) {
    let newSize = count + growth
    let destination = _growBuffer(newSize, minElementWidth: width)

同样地,来自StringCharacterView.swift

public mutating func append<S : Sequence>(contentsOf newElements: S)
    where S.Iterator.Element == Character {
    reserveCapacity(_core.count + newElements.underestimatedCount)
    for c in newElements {
      self.append(c)
    }
  }

甚至更好,来自Arrays.swift.gyb

public mutating func append<S : Sequence>(contentsOf newElements: S)
    where S.Iterator.Element == Element {
    let oldCount = self.count
    let capacity = self.capacity
    let newCount = oldCount + newElements.underestimatedCount

    if newCount > capacity {
      self.reserveCapacity(
        Swift.max(newCount, _growArrayCapacity(capacity)))
      }
    _arrayAppendSequence(&self._buffer, newElements)
  }

奇怪的是,我只能在Sequence中找到underestimatedCount的一个实现,并且该实现返回零。

此时似乎underestimatedCount对集合/序列的自定义实现更有价值,对于标准的Swift集合,Apple已经对这些集合的增长有了一个很好的了解。