在程序开发当中,for循环使用的频率无疑是最高的。常用的swift循环是递增式遍历。当然各种循环,swift都能办到。但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码。在swift3.0后,C语言形式被彻底废弃,因此从低版本升上来的代码如果是swift风格写法,按照提示基本可以直接fix。但如果很多循环实现都是基于C语言形式,那不得不讨论一下如何拯救这个可怕的习惯了。swift的循环语言特性跟python最为接近(ps:我学的语言当中最接近)。所以,大多数python循环能处理的情况,swift都能办到且更为优雅。
1:如何遍历一个字典或者数组?
首先要提的是swift的for..in..语法,这个语法在python当中被称之为迭代。用于数组,字典之类的数据内容遍历。从作用上分析,是直接将数组元素赋值给变量,并取出,无需通过数组下标来取值。而针对于字典,除了取出key值,我们还可以同时取出关键字。具体代码如下
1
2
3
4
5
6
7
8
9
|
let
list
= [
1
,
3
,
5
,
7
,
"string test"
]
for
i
in
list
{
print
(
i
)
}
let
dict
= [
"name"
:
"key name"
,
"name1"
:
"key1 name"
,
"name2"
:
"key 2 name"
]
for
key
in
dict
{
print
(
key
)
}
}
|
2:也许,我仅仅是需要一个计数器?
更多时候,循环变量被用于约束循环的次数或者做为int类型进行引用,值得一提的是,swift支持直接区间遍历。在3.0版本之前,python的区间语法range关键词适用。在3.0以后。swift不推荐使用。并且基于自身语言特性,在使用时,需要额外加关键字。那么,我们如何用swift带来的语法糖写出漂亮的for循环呢 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
for
i
in
1
..
<
10
{
print
(
i
)
// 打印结果为1-9
}
for
i
in
1
...
10
{
print
(
i
)
//打印结果为1-10
}
for
i
in
Range
(
start
:
1
,
end
:
10
){
print
(
i
)
// 打印结果为1-9 不推荐使用
}
|
3:help 我真的需要递减!
这也许是swift的一个大坑了,当然解决方式很容易。只需要一个关键字即可实现,swift3.0之后稍有变化。对要遍历的区间调用reverse()方法,即可实现for循环的反向遍历,代码如下
1
2
3
|
for
i
in
(
0
...
10
).
reverse
(){
print
(
i
)<
br
>
// 打印结果为10-0
}
|
4:这就结束了吗
当然不是啦,从语言特性上来上说,python对数组和循环的处理是最令人觉得舒适的。而在循环的处理上,几乎涵盖了python的所有特性,且大多也是以函数调用的方式来处理的。下面就要介绍一下平时可能会用到的一些方法。
4.1.enumerate
如词,这是为遍历对象调用一个枚举方法,在对数组等结构进行遍历时,我们偶尔需要知道每次遍历的索引,那么就需要用到enumerate了,其返回对象是一个元组,形式为(x,y),x代表遍历的索引值,y代表遍历的元素。代码如下:
1
2
3
4
5
|
for
(
index
,
i
)
in
(
1
...
10
).
enumerate
(){
print
(
index
)
// 遍历索引
print
(
i
)
// 遍历元素
}
|
4.2 filter
也许,你想要在循环就过滤掉一系列毫无意义的数据?,swift提供在循环时直接过滤的方法,代码如下:
1
2
3
4
5
6
7
8
9
|
for
i
in
(
1
...
10
).
filter
({
i
in
i
%
2
==
0
}) {
print
(
i
)
//输出结果为1-10之间的偶数
}
///////////补充一个漂亮的语法糖///////////
for
i
in
(
1
...
10
).
filter
({ $
0
%
2
==
0
}) {
//swift闭包可以省略参数且用$0匿名,第二个参数则用$1,以此类推
print
(
i
)
//输出结果为1-10之间的偶数
}
|
如上,除了单独调用方法对循环进行处理之外,swift还支持在循环中嵌套调用各种方法,这使得对数据的处理更为方便快捷,所以,也许彻底放弃C式循环,未尝不是一个好选择