Swift:For循环结束条件仅评估一次?

我试图了解Swift如何处理for-in循环。

概述:我们正在遍历NSOutlineView的行。如果满足条件,我们将展开该项目,这显然会更改outlineView的总行数。

前提条件:OutlineView有5个“根”项。每个项目都有5个子项。


示例

final class anOutlineView: NSOutlineView
{
    override func reloadData()
    {
        super.reloadData()
        
        for i in 0 ..< self.numberOfRows
        {
            // Assume we expand the item at row 0,which increases 
            // the overall outlineView row count from 5 to 10.
        }
    }
}

在这种方法中,循环在i == 4时停止。我认为那是因为Swift第一次遇到该范围时,它只会评估一次?有没有办法改变这种行为,以便每次像传统的for循环一样通过循环重新评估条件?

for循环替换while循环显然是可行的,这是一个很好的解决方案。我只是想了解Swift的细微差别,因为这种行为不是我所期望的。在Objective-C中,对for循环条件进行了每次迭代评估,这是众所周知的性能优化,它避免在循环条件中调用self.property(除非存在充分的理由,因为它在这种情况。)

kangzhai77 回答:Swift:For循环结束条件仅评估一次?

0 ..< self.numberOfRowsRange,尤其是Sequence。通过创建迭代器来完成对序列的迭代,然后调用其next()方法直到迭代器用尽,然后比较IteratorProtocol

每当对数组,集合或任何其他集合或序列使用for-in循环时,都将使用该类型的迭代器。 Swift在内部使用序列或集合的迭代器来启用for-in循环语言构造。

所以

for i in 0 ..< self.numberOfRows {
    ...
}

等同于

let range = 0 ..< self.numberOfRows
var it = range.makeIterator()
while let i = it.next() {
    ...
}

在迭代过程中修改numberOfRows不会改变范围(值类型)或迭代器,因此不会影响迭代次数。

本文链接:https://www.f2er.com/2472521.html

大家都在问