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

Swift - 3.0 去掉 C 风格循环的更多相关文章

  1. 关于 Swift 2.0 - 语言新特性与革新

    随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ...

  2. iOS开发系列--Swift 3.0

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

  3. Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】

    一.编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时 ...

  4. Swift 2.0 异常处理

    转自:http://www.jianshu.com/p/96a7db3fde00 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主 ...

  5. Swift 2.0 到底「新」在哪?

    [编者按]2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快.更简单地构建应用.本篇文章作者是 Maxime defa ...

  6. 一起聊聊 Swift 3.0

    Swift3.0将会给我们带来哪些改变: 1. 稳定二进制接口(ABI) ABI是什么呢?API大家都知道是应用程序接口 API只是提供函数签名 而ABI是系统和语言层面的 如果ABI稳定 意味着以后 ...

  7. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  8. Swift 2.0基本语法

    内容包括:01变量&常量 02分支 03循环 04字符串 05数组 06字典 07函数 01变量&常量 //: Playground - noun: a place where peo ...

  9. 《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字

    Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 原创文章,欢迎转载.转载请注明:关东升的博客 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后 ...

随机推荐

  1. VIM中 文件的打开与保存

    用 :edit 命令打开一个文件 :edit + {filename}           就可以打开一个文件到缓冲区中, 并且可以加文件路经的: 在路经中, %表示当前文件的完整路经, 用:h 可以 ...

  2. Linux编程_Shell脚本练习题

    1,编写shell脚本,计算1~100的和. #! /bin/bash `;do sum=$[$i+$sum] done echo $sum 2,编写shell脚本,输入一个数字n并计算1~n的和. ...

  3. 在Unity场景中控制日夜的轮转

    一.介绍 目的:通过在Unity场景中添加C#脚本完成日夜轮转的效果. 软件环境:Unity 2017.3.0f3,VS2013 二.操作过程 通过拖拽场景中的Directional Light我们知 ...

  4. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  5. 【转载】C#反射机制详解

    反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包 ...

  6. Bioperl 解析blast的输出结果

    用bioperl 解析blast的默认输出结果, 整理成-m8格式的输出 #!/usr/bin/perl use Bio::SearchIO; my ($blast) = @ARGV; my $sea ...

  7. XML 中可嵌入 cmd命令脚本

    原文要参照代码 1. XML解析 Task逻辑块可相互组合,形成复杂的树状结构,其结构用XML表示,即写成XML文件的形式. 样例如下: <!-- 顺序执行块 --> <seq> ...

  8. 【NLP】文本相似度

    http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html

  9. 和我一起学《HTTP权威指南》——客户端识别与cookie机制

    客户端识别与cookie机制 服务器需要区别是哪个客户端. 个性化接触 HTTP是匿名.无状态的请求/响应协议. Web站点希望: 对客户端的用户有更多的了解 追踪用户浏览页面的行为 因此,产生了几种 ...

  10. vue如何加入百度ssp广告位代码

    vue如何加入百度联盟广告,可以参考 :http://www.cnblogs.com/beileixinqing/p/8379184.html 这里讲述vue如何加入百度ssp媒体的广告 这里是百度异 ...