Swift - 3.0 去掉 C 风格循环
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 风格循环的更多相关文章
- 关于 Swift 2.0 - 语言新特性与革新
随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】
一.编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时 ...
- Swift 2.0 异常处理
转自:http://www.jianshu.com/p/96a7db3fde00 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主 ...
- Swift 2.0 到底「新」在哪?
[编者按]2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快.更简单地构建应用.本篇文章作者是 Maxime defa ...
- 一起聊聊 Swift 3.0
Swift3.0将会给我们带来哪些改变: 1. 稳定二进制接口(ABI) ABI是什么呢?API大家都知道是应用程序接口 API只是提供函数签名 而ABI是系统和语言层面的 如果ABI稳定 意味着以后 ...
- iOS开发——新特性Swift篇&Swift 2.0 异常处理
Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...
- Swift 2.0基本语法
内容包括:01变量&常量 02分支 03循环 04字符串 05数组 06字典 07函数 01变量&常量 //: Playground - noun: a place where peo ...
- 《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字
Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 原创文章,欢迎转载.转载请注明:关东升的博客 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后 ...
随机推荐
- 【转】【Android】Android Drawable Shape 组合画田字格
使用layer-list组合多个Shap <?xml version="1.0" encoding="utf-8"?> <layer-list ...
- C语言中的运算和运算符
一.运算符的优先级和结合性 1,优先级 运算符一览表中,运算符越靠上,优先级越高. 2,结合性 假如用O表示需要两个操作数的双目运算符,那么对于表达式aObOc: 左结合运算符会将表达式解释为 (a ...
- MySQL存储过程、触发器 小例子
一.存储过程 语法: CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...]) BEGIN ... END 参数: IN 输入参数 表示该参数的值必须在调用存 ...
- 创建自己的PKI公/私密钥对和公钥证书
1. 创建certificate request configuration file cert_req.conf******************************************* ...
- #HTTP协议学习# (八)状态码详解
可直接参考:http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html
- DATGRIDVIEW如何不选择第一行,第一列
DataBindingComplete事件中写 ClearSelection();
- C# Bitmap/png转成jpg格式,压缩图片
public static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecIn ...
- 【Web API系列教程】3.3 — 实战:处理数据(建立数据库)
前言 在本部分中,你将在EF上使用Code First Migration来用測试数据建立数据库. 在Tools文件夹下选择Library Package Manager,然后选择Package Ma ...
- (第3篇)HDFS是什么?HDFS适合做什么?我们应该怎样操作HDFS系统?
摘要: 这篇文章会详细介绍HDFS是什么,HDFS的作用,适合和不适合的场景,我们该如何操作HDFS? HDFS文件系统 Hadoop 附带了一个名为 HDFS(Hadoop分布式文件系统)的分布 ...
- 复习js
js写在页面最后如果放在前面,需要加window.onload=function(){)常见的两种输出方式 在网页中弹出显示框,显示信息 alert() 在控制台输出消息,一般用来调试程序consol ...