当我在Playground中使用for循环时,一切都很好,直到我将for循环的第一个参数更改为最大值。(按降序迭代)
这是一个bug吗?还有其他人有吗?
for index in 510..509
{
var a = 10
}
显示将要执行的迭代次数的计数器一直在滴答作响……
当我在Playground中使用for循环时,一切都很好,直到我将for循环的第一个参数更改为最大值。(按降序迭代)
这是一个bug吗?还有其他人有吗?
for index in 510..509
{
var a = 10
}
显示将要执行的迭代次数的计数器一直在滴答作响……
当前回答
Swift向前
for i in stride(from: 5, to: 0, by: -1) {
print(i)
}
//prints 5, 4, 3, 2, 1
for i in stride(from: 5, through: 0, by: -1) {
print(i)
}
//prints 5, 4, 3, 2, 1, 0
其他回答
对范围应用reverse函数进行反向迭代:
对于Swift 1.2及更早版本:
// Print 10 through 1
for i in reverse(1...10) {
println(i)
}
它也适用于半开放范围:
// Print 9 through 1
for i in reverse(1..<10) {
println(i)
}
注意:reverse(1…10)创建了一个类型为[Int]的数组,所以虽然这可能适用于较小的范围,但明智的做法是如下所示使用lazy,或者如果您的范围很大,则考虑接受的stride答案。
为了避免创建大数组,请使用lazy和reverse()。下面的测试在Playground中高效运行,显示它没有创建一个包含一万亿int的数组!
测试:
var count = 0
for i in lazy(1...1_000_000_000_000).reverse() {
if ++count > 5 {
break
}
println(i)
}
对于Xcode 7中的Swift 2.0:
for i in (1...10).reverse() {
print(i)
}
注意,在Swift 2.0中,(1…1_000_000_000_000).reverse()的类型是ReverseRandomAccessCollection<(Range<Int>)>,所以这工作正常:
var count = 0
for i in (1...1_000_000_000_000).reverse() {
count += 1
if count > 5 {
break
}
print(i)
}
对于Swift 3.0, reverse()已重命名为reversed():
for i in (1...10).reversed() {
print(i) // prints 10 through 1
}
如果希望反向遍历数组(array或更一般的任何SequenceType)。您还有一些额外的选项。
首先,您可以reverse()数组并像往常一样遍历它。但是我更喜欢使用enumerate(),因为它输出一个包含对象和它的索引的元组。
这里需要注意的一件事是,以正确的顺序调用它们是很重要的:
For (index, element) in array.enumerate().reverse()
按降序生成索引(这是我通常期望的)。而:
for (index, element) in array.reverse().enumerate()(与NSArray的reverseEnumerator更接近)
反向遍历数组,但输出升序索引。
你可以考虑使用c风格的while循环。这在Swift 3中工作得很好:
var i = 5
while i > 0 {
print(i)
i -= 1
}
这将以相反的顺序递减1。
let num1 = [1,2,3,4,5]
for item in nums1.enumerated().reversed() {
print(item.offset) // Print the index number: 4,3,2,1,0
print(item.element) // Print the value :5,4,3,2,1
}
或者你可以用这个index value属性
let num1 = [1,2,3,4,5]
for (index,item) in nums1.enumerated().reversed() {
print(index) // Print the index number: 4,3,2,1,0
print(item) // Print the value :5,4,3,2,1
}
对我来说,这是最好的办法。
var arrayOfNums = [1,4,5,68,9,10]
for i in 0..<arrayOfNums.count {
print(arrayOfNums[arrayOfNums.count - i - 1])
}