Swift array.count是否在循环中每次都得到计算

Swift array.count是否在循环中每次都得到计算,swift,Swift,我想这是一个每种语言都必须问的问题,但当你写作时,例如: while i < array.count { ... } 是的,每次迭代都会对其进行评估 赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大 是的,每次迭代都会对其进行评估 赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大 数组获取计数属性,因为它符合集合。Collection状态下的count文档 复杂性:O(1)如果集合符合

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

while i < array.count {
    ...
}

是的,每次迭代都会对其进行评估


赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大

是的,每次迭代都会对其进行评估


赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大

数组
获取
计数
属性,因为它符合
集合
Collection
状态下的
count
文档

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


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

Array
获取
count
属性,因为它符合
集合。
Collection
状态下的
count
文档

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

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

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) }
}
var数组:[Int]
打印(“测试用例1-当i
测试用例1-当i 一,

二,

三,

四,

五,

六,

123

123

123

测试用例2-针对数组中的i.index

一,

二,

三,

四,

五,

六,

测试用例3-对于0中的i.. 一,

二,

三,

四,

五,

六,

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) }
}
var数组:[Int]
打印(“测试用例1-当i
测试用例1-当i 一,

二,

三,

四,

五,

六,

123

123

123

测试用例2-针对数组中的i.index

一,

二,

三,

四,

五,

六,

测试用例3-对于0中的i.. 一,

二,

三,

四,

五,

六,

是的,每次都有人打电话 让我们运行一个简单的测试,首先我们需要以下数组扩展

extension Array {
    var myCustomCount: Int {
        print("myCustomCount")
        return self.count
    }
}
然后我们可以试试这个代码

let nums = [1, 2, 3, 4, 5]
var i = 0
while i < nums.myCustomCount {
    i += 1
}

是的,它每次都会被呼叫 让我们运行一个简单的测试,首先我们需要以下数组扩展

extension Array {
    var myCustomCount: Int {
        print("myCustomCount")
        return self.count
    }
}
然后我们可以试试这个代码

let nums = [1, 2, 3, 4, 5]
var i = 0
while i < nums.myCustomCount {
    i += 1
}

小心下面的for循环。由于
elems.count
是在循环顶部构造一次的范围的一部分,因此它只计算一次。当
i=4
时,以下代码将失效:

var elems = [1, 2, 3, 4, 5, 6]

for i in 0 ..< elems.count {
    if i % 2 == 0 { // remove even elements
        elems.remove(at: i)
    }
}
var elems=[1,2,3,4,5,6]
对于0中的i..

中的
数组.count
,而
确实会在每次评估条件时得到评估。

请小心下面的for循环。由于
elems.count
是在循环顶部构造一次的范围的一部分,因此它只计算一次。当
i=4
时,以下代码将失效:

var elems = [1, 2, 3, 4, 5, 6]

for i in 0 ..< elems.count {
    if i % 2 == 0 { // remove even elements
        elems.remove(at: i)
    }
}
var elems=[1,2,3,4,5,6]
对于0中的i..

数组中的
计数
,而
确实会在每次评估条件时得到评估。

通常可以完全避免此类显式检查,例如
检查数组中的idx。索引
检查数组中的元素
–即使对于0中的i,
。您最好希望每次都计算
数组.count
,因为您可能只是在
while
循环中从数组中添加和/或删除对象。@rmaddy一些编译器可能会检测到这一点,并相应地更改
while
中的“是”和“否”行为