关于for循环,这里不做过多解释,大家都很熟悉,其在C语言中的使用格式是这样的:
for(int i = 0 ; i < 10; i++){
// 你需要做的操作
}
这也就是标准的C-Type格式的for循环;
另外,在OC中还有另外一个遍历集合的for-in循环,其格式是这样的:
for (NSString *string in array) {
NSLog(@"%@",string);
}
那么,在swift中的for循环又是怎样的呢?
在Swift中for循环变得更加强大灵活,写法上也有以上两种方式:
for var i = 0; i < 10; i += 1 {
}
for i in 0..<10 {
}
只不过,in关键字后不但可以接一个集合类型,还可以跟一个区间类型;
- ..< 是不包含10的,
- ... 是包含10的;
但是,在最新的swift 3.0中,使用C-Type格式for循环时,Xcode会有警告:
提示我们改为for-in循环,这在大多数情况下是能满足需求的;
但是,for-in循环每次增加的步长是1,如果我们想每次循环加2怎么办呢?
这就用到了下面这个函数:
// swift 2.0
stride(to: <Int>, by: <Distance>)
//调用者: 就是索引的开始数字,例如:0;
//参数to: 就是最大数值,不包含此数值,例如:10;
//参数by: 就是步长,每次改变的大小
// 在swift 3.0 中,此方法改为
stride(from: <T>, to: <T>, by: <T.Stride>)
// from: 起始数
// to: 最大数,不包含此数值
// by: 步长,每次改变的大小
这样,我们就可以写一个从0到10,每次增加2的for循环:
//swif 2.0
for i in 0.stride(to: 10, by: 2) {
//
print(i)
}
// swift 3.0
for i in stride(from: 0, to: 10 ,by: 2) {
print(i)
}
控制台的输入是一样的:
0
2
4
6
8
这里的变量是包含0,不包含10,也就是前闭后开的集合;如果想包含后面的值,就需要修改一下stride函数的参数:
// swift 2.0
stride(through: <Int>, by: <Int>)
//swif 3.0
stride(from: T, through: T, by: T.Stride)
即:
// swift 2.0
for i in 0.stride(through: 10, by: 2) {
print(i)
}
// swift 3.0
for i in stride(from: 0, through: 10, by: 2) {
print(i)
}
控制台的输出,就包含了10:
0
2
4
6
8
10
以上,都是从小到大递增的,能不能递减呢?
答案是可以的,只需要用最大的数值去调用stride方法,传入一个较小的结束参数,步长改为负数即可,例如:
// swift 2.0
for i in 10.stride(through: 0, by: -2) {
print(i)
}
// swift 3.0
for i in stride(from: 10, through: 0, by: -2) {
print(i)
}
控制台输出:
10
8
6
4
2
0
对于步长是1的区间,递减运算还可以这样做:
// 正常顺序
for i in 1..<10 {
print(i)
}
// 递减输出
for i in (1..<10).reversed() {
print(i)
}