在迭代其范围时修改Swift数组 - 0到count,startIndex到endIndex

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在迭代其范围时修改Swift数组 - 0到count,startIndex到endIndex相关的知识,希望对你有一定的参考价值。

我是Swift的新手,我正在探索如果在使用Range迭代它时修改集合会发生什么。我无法弄清楚为什么这两个循环有不同的行为:

var things = ["a", "b", "c"]
for i in 0..<things.count {
    print("i: (i) count: (things.count) value: (things[i])")
    if i == 1 {
        things.append("x")
    }
}
// i: 0 count: 3 value: a
// i: 1 count: 3 value: b
// i: 2 count: 4 value: c

VS

var things = ["a", "b", "c"]
for i in things.startIndex...things.endIndex {
    print("i: (i) count: (things.count) value: (things[i])")
    if i == 1 {
        things.append("x")
    }
}
// i: 0 count: 3 value: a
// i: 1 count: 3 value: b
// i: 2 count: 4 value: c
// i: 3 count: 4 value: x

我创建了这个Array类扩展,所以我可以看到Range文本何时访问数组的属性:

extension Array {
    var myCount: Int {
        print("myCount ((self.count))")
        return self.count
    }
    var myStartIndex: Int {
        print("myStartIndex ((self.startIndex))")
        return self.startIndex
    }
    var myEndIndex: Int {
        print("myEndIndex ((self.endIndex))")
        return self.endIndex
    }
}

如果我使用这些属性而不是正常属性,我得到:

myCount (3)
i: 0 count: 3 value: a
i: 1 count: 3 value: b
i: 2 count: 4 value: c

myStartIndex (0)
myEndIndex (3)
i: 0 count: 3 value: a
i: 1 count: 3 value: b
i: 2 count: 4 value: c
i: 3 count: 4 value: x

我必须遗漏一些东西,因为这感觉就像魔术!似乎endIndex正在重新评估,但count不是。是什么赋予了?

答案

这是因为在第一段代码中,您使用了半开放范围运算符(..<),而在第二段代码中,您使用了正常范围运算符(...)。它们是不同的。来自apple docs

半开范围运算符(a..<b)定义了从a到b的范围,但不包括b。

因此,如果for为4时things.count循环不会继续,那么当与半开放范围运算符一起使用时,范围(0 - 4)仅在i为0,1,2或3时循环。

如果使用...而不是..<,第一段代码的结果将与第二段相同。

以上是关于在迭代其范围时修改Swift数组 - 0到count,startIndex到endIndex的主要内容,如果未能解决你的问题,请参考以下文章

Swift 范围界定问题

修改行数组时,Swift 2数据不会重新加载数据

Swift 计算属性返回底层数组的副本

Swift:填充二维数组时出现索引超出范围错误

范围和数组 SWIFT 出现问题

如何快速创建具有定义数量的元素的数组