博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift - 3.0 去掉 C 风格循环
阅读量:6158 次
发布时间:2019-06-21

本文共 2381 字,大约阅读时间需要 7 分钟。

Swift 3.0 版本去掉了沿用已久的 C 风格循环语法, 又是向现代开发语言的一次迈进, 咱们就来看看没了 C 风格循环我们还有什么选择

C 风格循环

关于 C 风格循环, 不我们过多介绍了, 就是类似这样的语句:

let numberList = [1, 2, 3, 4, 5]for var i = 0; i < numberList.count; i++ {}

如今这样的语法在新版本的 Swift 中即将成为历史了, C 风格的循环语法可能是大家最熟悉的, 大家会不会觉得突然去掉这个语法有些不适应呢? 咱们再来看看 Swift 3 中的替代方案。

for .. in 语法

第一个替代方案, 我们可以使用 for .. in 这样的语法:

let numberList = [1, 2, 3, 4, 5]var result = ""for num in numberList {    result += "\(num) "}

这样就完成了对数组的遍历了, 但是还有另一个情况, 如果我们想知道每次遍历的索引怎么办呢, 还有一种方法:

for num in numberList.enumerate() {    result += "[\(num.index)]\(num.element) "}

我们可以使用这个集合类型的 enumerate 方法,将这个数组的索引和对应的元素都取了出来,然后我们在循环中就可以对索引项进行引用了, num.index 和 num.element 分别代表对应的索引和元素。

上面这个循环我们还可以再改写一下:

for (index, item) in numberList.enumerate() {    result += "[\(index)]\(item) "}

不难看出,其实循环中的每一项都是一个元组(Tuple),这个元组的第一项是当前的索引, 第二项是当前的数组元素。 那么我们就可以推理出, enumerate 函数其实就是对 numberList 数组做了一个变换,原来它是一个 Int 类型的数组,经过变换后,成为了 (Int, Int) 元组类型的数组。

是不是这么回事呢? 查看 enumerate 方法的文档后, 看到它的定义是这样的:

func enumerate() -> EnumerateSequence
>

 

比我们想象的要复杂些, EnumerateSequence 是个什么鬼, 让我们再来看看它的文档定义:

The SequenceType returned by enumerate(). EnumerateSequence is a sequence of pairs (n, x), where ns are consecutive Ints starting at zero, and xs are the elements of a Base SequenceType

 

 仔细看下, 其实跟我们理解的还是差不多的, 它只不过是对集合类的一个集成, 这个集合每一项是一个元组 (n, x) , n 代表索引, x 代表数组元素。

 那么,我们还可以做点更有意思的事情:

调用 enumerate, 之后再调用 reverse 方法, 我们就可以对一个数组进行反向遍历

for (index, item) in numberList.enumerate().reverse() {    result += "[\(index)]\(item) "}

 

 

我们还可以:调用 filter 函数,过滤某些索引, 只遍历符合条件的那些元素。  

for (index, item) in numberList.enumerate().filter({ (index, item) in index % 2 == 0}) {    result += "[\(index)]\(item) "}

 

 

当然, 我们还可以做的更多更多, 大家有兴趣可以看看 SequenceType 的文档 

 

区间(Range)循环

除了刚才咱们说的这些, Swift 还提供了更方便的循环语法, 叫做 Range 循环。 比如这样:

 

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 不推荐使用}

需要递减遍历reverse

for i in (0...10).reverse(){    print(i)   // 打印结果为10-0}

 

enumerate

for (index, i) in (1...10).enumerate(){    print(index)// 遍历索引    print(i) // 遍历元素     }

filter

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之间的偶数}

 

转载于:https://www.cnblogs.com/junhuawang/p/6226983.html

你可能感兴趣的文章
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>
C#一个关于委托和事件通俗易懂的例子
查看>>
类似于SVN的文档内容差异对比工具winmerge
查看>>
Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
查看>>
quratz线程
查看>>
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
AutoReleasePool 和 ARC 以及Garbage Collection
查看>>
ASCII和Unicode编码
查看>>
PHP - 如何在函数内访问另一个文件中的变量
查看>>
perl连接mysql的例子
查看>>
软文推荐:常用 Java 静态代码分析工具的分析与比较
查看>>
Office Communication Server(OCS) 2007存档和CDR的部署
查看>>
python系列(三)python列表详解
查看>>
ORA-03114乌龙处理
查看>>