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

C 风格循环

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

let numberList = [, , , , ]
for var i = ; i < numberList.count; i++ {
}

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

for .. in 语法

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

let numberList = [, , , , ]
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<array<element>></array<element>

比我们想象的要复杂些, 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 %  == }) {
result += "[\(index)]\(item) "
}

当然, 我们还可以做的更多更多, 大家有兴趣可以看看 SequenceType 的文档 http://swiftdoc.org/v2.2/protocol/SequenceType

区间(Range)循环

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

for i in ..<{
print(i)
// 打印结果为1-9
}
for i in ...{
print(i)
//打印结果为1-10
} for i in Range(start: ,end: ){
print(i)
// 打印结果为1-9 不推荐使用
}

需要递减遍历reverse

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

enumerate

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

filter

for i in (...).filter({ i in i %  == }) {
print(i)
//输出结果为1-10之间的偶数
}
///////////补充一个漂亮的语法糖///////////
for i in (...).filter({ $ % == }) {//swift闭包可以省略参数且用$0匿名,第二个参数则用$1,以此类推
print(i)
//输出结果为1-10之间的偶数
}

最新文章

  1. css中单位px、pt、em和rem的区别
  2. hibernate 连接oracle数据库的配置 (参考)
  3. Hibernate+jsp+struts+spring做增删该查,
  4. 【转】【C#】C#性能优化总结
  5. C# 小规模查找集合性能测试
  6. Jquery获取selelct选中值
  7. PHP Mysql类【转】
  8. 【HDOJ】4704 Sum
  9. Struts 和Spring的核心控制器
  10. 简谈-Python的注释、变量类型、标识符及关键字
  11. android 统计启动时长,标准
  12. UVA 11636-Hello World!(水题,猜结论)
  13. VC++ 6.0 中使用 MSComm.ocx
  14. 在 Mac OS X 10.10 安装 pyenv 的一个小坑
  15. 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解
  16. 一文说尽MySQL事务及ACID特性的实现原理
  17. SQL删除多列语句
  18. 风云2号云图Mosaic Dataset处理
  19. ecshop后台0day漏洞原理+利用方法 XSS+Getshll
  20. 7、包装类、System、Math、Arrays、大数据运算

热门文章

  1. python进行数据分析------相关分析
  2. 近期小结 之 Servlet规范及HTTP
  3. 关于sdl_ttf使用字体库加载失败的问题
  4. application.properties详解 --springBoot配置文件
  5. 测试webservice的时候,如果出现这个错误:&quot;The test form is only available for requests from the local machine&quot;
  6. win 10中打开sql server配置管理器
  7. 利用jQuery实现回收站删除效果
  8. hibernate validate
  9. Spring Boot 处理 REST API 错误的正确姿势
  10. Lua环境配置和工具介绍