Swift array.count每次都在循环中得到评估

tay*_*ift 0 swift

我想这是一个必须要求每种语言的问题,但是当你写作例如:

while i < array.count {
    ...
}
Run Code Online (Sandbox Code Playgroud)

确实array.count每个循环运行时间得到评估?let在运行这样的循环之前将它存储在常量中是否更好?

let length = array.count
while i < length {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*ens 8

Array获取count属性,因为它符合Collection。对于文档countCollection状态

复杂度:O(1) 如果集合符合 RandomAccessCollection;否则,O(n),其中 n 是集合的长度。-来源

由于Array也符合RandomAccessCollection,所以获取数组的计数是一个常数时间操作。在开始时获取一次与每次循环迭代之间不应该有任何重大的性能差异。

  • 这个答案实际上并没有回答*“每次循环运行时是否对 array.count 进行评估”* 的问题。 (5认同)
  • 尽管这个答案没有回答实际的问题。我正在寻找这些信息。 (3认同)

Ale*_*ica 6

while循环(和do while循环)在每次迭代时都会对其谓词进行求值.

for 循环评估序列一次.

这是一个演示:

var array: [Int]

print("Test Case 1 - while i < array.count")
array = [1, 2, 3, 4, 5, 6]
var i = 0
while i < array.count {
    print(array[i])
    if i < 3 { array.append(123) }
    i += 1
}
print("\r\nTest Case 2 - for i in array.indices")
array = [1, 2, 3, 4, 5, 6]
for i in array.indices {
    print(array[i])
    if i < 3 { array.append(123) }
}

print("\r\nTest Case 3 - for i in 0 ..< array.count")
array = [1, 2, 3, 4, 5, 6]
for i in 0 ..< array.count {
    print(array[i])
    if i < 3 { array.append(123) }
}
Run Code Online (Sandbox Code Playgroud)

测试用例1 - 当我<array.count

1

2

3

4

6

123

123

123

测试用例2 - 对于array.indices中的i

1

2

3

4

6

测试用例3 - for i in 0 .. <array.count

1

2

3

4

6