gpt4 book ai didi

arrays - 在迭代其范围时修改 Swift 数组 - 0 计数与 startIndex 到 endIndex

转载 作者:行者123 更新时间:2023-11-28 12:12:37 24 4
gpt4 key购买 nike

我是 Swift 的新手,我正在探索如果在使用范围迭代集合时修改集合会发生什么。我不明白为什么这两个循环有不同的行为:

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

对比

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 开始:

The half-open range operator (a..<b) defines a range that runs from a to b, but doesn’t include b.

因此,如果 for 为 4,则第一段代码中的 things.count 循环不会继续,因为范围 (0 - 4) 与半开范围运算符一起使用时,仅当 i 为 0、1、2 或3.

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

关于arrays - 在迭代其范围时修改 Swift 数组 - 0 计数与 startIndex 到 endIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47958458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com