引言:
Swift至3.0版本伊始就取消了传统C语言家族的for
写法。下面就以某些情况下循环的写法展开讨论。
从某范围开始至某范围结束(开区间,区间为递增区间)
这种情况下先以C家族的for
循环举例。设从[0,10)内取出每次递增的正整数,并打印,则:
for(int i = 0; i < 10; i++){
System.out.println("PARA: " + i);
// Or this situation of C:
printf("%d",i);
}
上述写法是传统C家族写法,某些特殊情况下这些代码在C,C++,C#,Java甚至不需要修改都是通用的。Swift 3.0之前甚至写法也是高度类似。那么现在在Swift 5.0版本的写法则:
for i in 0..<10 {
print("PARA: \(i)")
}
这种写法给人的感觉变成了不再是过程式,而是函数式。for
后跟着的是循环变量(如果只是简单递增不需要var),in
后跟一个开区间写法。该开区间写法是开始数值..<结束数值
从某范围开始至某范围结束(闭区间,区间为递增区间)
传统的C家族写法只需将初始条件和结束条件修改一下即可。现以Swift分析举例:
for i in 0...10 {
print("PARA: \(i)")
}
in
语句后跟的仍然是范围区间。只不过这里变成了开区间。开区间写法为:开始数值...结束数值
从某范围开始至某范围结束(开区间,区间为递减区间)
这里现以C家族举例:
for(int i = 10; i > 0; i--){
System.out.println("PARA: " + i);
// Or this situation of C:
printf("%d",i);
}
上述举例是初始条件为10,结束条件为变量大于0,循环条件为每次变量都递减。那么在Swift写法中则应该使用reversed()
方法来倒序某集合来达到递减效果。则:
for i in (0..<10).reversed() {
print("PARA: \(i)")
}
可以看到使循环区间为递减的方法是使用reversed()
方法方法
从某范围开始至某范围结束(闭区间,区间为递减区间)
这里直接给出Swift写法:
for i in (0...10).reversed() {
print("PARA: \(i)")
}
跨步写法(stride)
传统的C家族写法很简单,更改循环条件即可。如:
for(int i = 0; i < 10; i = i + 2){
System.out.println("PARA: " + i);
// Or this situation of C:
printf("%d",i);
}
在Swift里面联合泛型容易想到现直接定义一个跨步泛型数组:
var arrayItem: Array<Int> = [0,2,4,6,8,10]
for i in arrayItem{
print("PARA: \(i)")
}
这样每次循环递增的就不再是1而是2了,我们可以更改泛型数组的内容,使其每次循环达到我们想要的递增数。递增的区间为小范围尚可,但形如成百上千该如何?使用先定义跨步泛型再操作显得十分繁琐,幸而Apple提供了一个这样的语句stride()
。
该语句有两个重载方法,分别是:
stride(from: , to: , by: )
stride(from: , through: , by: )
第一个语句的第一个参数是开始条件,第二个参数是结束条件,第三个是递增数。区间为开区间。
第二个语句的第一个参数是开始条件,第二个参数是结束条件,第三个是递增数。区间为闭区间。
那么该语句可使用stride()写法如下:
for i in stride(from: 0, through: 10, by: 2){
print("PARA: \(i)")
}
那么stride()
递减写法是怎样写的?也很简单,stride()
后直接加上.reserved()
即可。
有些读者可能有疑问:每次递增或递减的是浮点数该如何?也很简单,by
后跟的参数支持浮点数。