英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427

Swift提供了类C语言类似的控制流结构。包含for循环和while循环来多次运行任务,if和switch语句依据不同的条件运行不同的分支代码,break和continue语句将运行流程跳转到其它语句。

除了C里面传统的for-条件-递增循环。Swift还添加了for-in循环使得遍历数组。字典,范围,字符串或者其它序列都非常easy。

Swift的switch语句也要比C语言的switch更强大。

Swift里面某个case语句运行完以后不会再去运行后面的case。避免C语言中因为忘记写break而引起的错误。

case能够匹配多种不同的类型模式,包含范围匹配,元组或者某个特定的类型(casts to a specific type)。

case其中被匹配的值能够与暂时常量或者变量绑定以便在case里面能够使用,复杂的匹配条件能够使用where来表示。

1.for循环

for循环重复运行语句指定次数。

Swift提供两种形式的for循环:

  • for-in在某个范围,序列。集合或者系列中对每一个元素运行一次。

  • for-condition-increment重复运行直到满足某个特殊条件,一般在每次循环之后计数器递增。

for-in

你能够使用for-in循环来遍历集合的元素,比方一个范围的数字,某个数组中的元素或者字符串中的字符。

以下的样例输出乘法表中乘5的那一行:

for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

要遍历的元素集合是使用...创建的1到5的一个闭区间。index的值被设置为范围的第一个值1,循环体中的语句被运行。这个样例中循环体仅仅包括一条语句。就是输出乘法表。语句运行完以后。index的值使用范围的第二个值2更新,输出语句又被运行了。这个过程一直范围的最后一个值。

上面资历中。index是常量,在每次进行循环的时候自己主动被赋值。这样的情况index没有必要再使用前就声明。

在for-in其中直接使用index就相当于是隐式声明了常量index,都不须要再使用letkeyword。

NOTE 常量index的作用范围不过循环体,假设你想在循环结束以后查看index的值,或者你想让index作为变量而不是常量,那你必须在循环之前自己去声明index。

假设你并非须要范围中的全部值,你能够通过使用在变量的位置使用下划线来忽略元素的值。

let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
println("\(base) to the power of \(power) is \(answer)")
// prints "3 to the power of 10 is 59049"

这个样例计算base的power次方(样例中是3的10次方)。

样例从1乘3開始,乘了10次,使用了从0到9的半闭区间(这里有问题吗,原文是using a half-closed loop that start with 0 and ends with9,可是样例没有半闭区间也没有0到9啊)。

这个计算不须要知道每次循环计数器的值,仅仅须要每次循环的之后给answer再乘base即可了。

循环变量的位置使用的下划线使得每次循环过程都忽略了循环变量的值,也不提供获取循环变量值的途径了。

使用for-in循环遍历数组中的元素:

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
println("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

你还能够遍历获取字典的key-value对。

字典的每一个元素以元组(key, value)的形式返回。你能够将其成员解析到指定的常量中以便循环中使用。以下样例将字典的key解析到常量animalName。字典的值被解析到常量legCount:

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs

字典中的元素被遍历的顺序与插入时的顺序是没有关系的。字典中的元素是无序的,遍历的时候也不会保证有什么顺序。

除了数组和字典,你还能够使用for-in循环遍历字符串中的字符:

for character in "Hello" {
println(character)
}
// H
// e
// l
// l
// o

for-condition-increment

除了for-in循环,swift还支持传统的C风格的带有条件和递增语句的for循环:

for var index = 0; index < 3; ++index {
println("index is \(index)")
}
// index is 0
// index is 1
// index is 2

这种循环的一般格式是这种:

for initialization ; condition ; increment {

     statements

}

和C一样分号分隔了循环定义的三个部分。可是和C不一样的是Swift不须要在initialization ; condition ; increment外面加括号。

循环的运行顺序例如以下:

  1. 当第一次进入循环的时候,初始化表达式(initialization)被运行,创建循环可能会用到的常量或者变量。

  2. 条件表达式被运行。

    假设条件表达式结果为false。循环结束,程序运行循环体以后的代码。假设条件表达式为true。就运行循环体。

  3. 循环体中全部语句都运行完了以后,递增语句才被运行。这条语句一般用来递增或者递减计数器。或者依据语句输出来给已经初始化过的变量更新值。

    当递增语句运行完以后。程序回到第二步,条件语句又被运行一次。

循环格式和运行过程能够使用以下等价的形式来表达:

initialization

while condition {

    statements

    increment

}

在初始化表达式中声明(比方var index = 0)的常量和变量仅仅能在这个for循环中可以使用。要在循环结束后使用index,必须在循环之前声明index。

var index: Int
for index = 0; index < 3; ++index {
println("index is \(index)")
}
// index is 0
// index is 1
// index is 2
println("The loop statements were executed \(index) times")
// prints "The loop statements were executed 3 times"

注意循环全然结束以后index的值是3而不是2.最后一次递增语句++index被运行,index变为3,然后index<3等于false。循环结束。

2.while循环

while循环重复运行循环体直到条件变为false。这样的循环很适用于在循环体运行之前循环次数未知的情况。Swift提供两种while循环形式:

  • while:每次运行循环体之前先计算条件的值。
  • do-while:每次运行完循环体之后计算条件的值。

while

while循环以计算条件表达式開始。假设条件为true,循环体就被重复运行知道条件为false,以下是while循环的一般形式

while condition {

statements

}

以下玩一个蛇与梯子的游:

游戏规则:

  • 棋盘有25个方格,游戏的目的是要到达或者超过第25格。

  • 每次一轮,你须要摇色子来决定你走几格,路线如上图虚线所看到的。
  • 假设这一轮结束的时候你到了梯子的底部,就顺着梯子上去。

  • 假设你这轮结束的时候碰到了舌头。就顺着射移到以下去。

棋盘能够使用一个Int数组来表示。

棋盘大小使用常量finalSquare存储,用来初始化数组以及后面检查游戏是否通关。

棋盘使用26个0来初始化。而不是25个(下标从0到25):

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)

一些涉及到蛇和梯子的方格要被设置为特殊值。挨着梯子底部的方格设置为整数用来向上移动。而挨着蛇头的方格被设置为负数用来向下滑:

board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08

第3格有一个梯子。能够爬到第11格,所以borad[03]被设置为+8,上面整数前面带加号知识为了看起来更清晰,下标小于10的前面加0仅仅是为了代码整齐。(加号和多余的0都不是必须的。可是这里加上能让代码更清晰。

游戏从第0格開始。就是在棋盘左下角之外。第一次掷色子就能移到棋盘上了:

var square = 0
var diceRoll = 0
while square < finalSquare {
// roll the dice
if ++diceRoll == 7 { diceRoll = 1 }
// move by the rolled amount
square += diceRoll
if square < board.count {
// if we're still on the board, move up or down for a snake or a ladder
square += board[square]
}
}
println("通关! ")

上面样例里使用非常easy的方式来掷色子。让diceRoll从0開始,每次循环给他加1,++diceRoll返回的是+1后的值,所以当diceRoll+1等于7的时候再把diceRoll设置为1,所以色子的结果是1,2,3,4,5,6,1,2,3...而不是用随机数。

色子投出来以后,玩家移动diceRoll相应的格数。假设玩家移动以后的格数大于或者等于25就赢了。考虑这样的情况,代码在移动以后检測当前位置是不是比棋盘格数要小。假设比棋盘格数小才加上那一格中的值,假设不小。就说明过关了。那一格中存储的值就是顺着梯子往上爬或者顺着蛇往下爬的格数。

假设不加这个推断,board[square]就有可能要去获取数组board范围外的值,将会引起执行错误。

假设如今squre等于26。代码会去获取board[26]。这个下标超过数组board的范围了。

当前循环体运行完了以后,运行循环条件语句,看循环是否继续运行。假设玩家已经移动到或者超过第25格。循环条件结果就是false,游戏就结束了。

这个样例使用while循环是比較合适的。由于在循环開始之前是不知道游戏要进行的次数的。相反,循环是一直运行到某个特定的条件满足才停止。

do-while

还有一种while循环do-while先运行一次循环体。然后才去推断循环条件。然后循环运行循环体直到循环条件为false。

以下是do-while的一般形式:

do {

statements

} while condition

以下还是蛇与梯子的游戏。这次使用do-while而不是while了。finalSquare,board,square和diceRoll的初始化方式还和上面一样:

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0

这次游戏循环第一步就是检查是否在梯子或蛇上。由于没有梯子能够直接通到第25格,所以玩家不可能通过梯子移动就直接通关。所以循环第一步直接检查蛇或者梯子是安全的。(这里读起来挺别扭的好像没有解释清楚,应该是说用do-while的时候循环第一步就能够直接加上当前格子相应的数字,而不是先掷色子,由于掷色子移动然后就可能到达25格,那你再爬梯子之前就须要前面那个if了,可是假设先爬梯子,就不用推断接着就掷色子。由于从图上看出来爬梯子不可能会通关的。)

游戏開始的时候玩家在第0格上,board[0]还是0,没有什么影响:

do {
<span style="white-space:pre"> </span>// move up or down for a snake or ladder
<span style="white-space:pre"> </span>square += board[square]
<span style="white-space:pre"> </span>// roll the dice
<span style="white-space:pre"> </span>if ++diceRoll == 7 { diceRoll = 1 }
<span style="white-space:pre"> </span>// move by the rolled amount
<span style="white-space:pre"> </span>square += diceRoll
} while square < finalSquare
println("Game over!")

代码检查过梯子或者蛇以后,再通过掷色子移动。然后一轮循环结束。

循环条件是相同的,与以前的,但是这一次,当循环条件只完成了第一个周期将是第一个计算。对于这场比赛,do-while周期比while周期比较合适。在之上do-while循环,当循环条件确定squre不过在黑板上时,他开始下一个周期,而进入循环开始运行squre+=board[square]。这省去了前面square检查边界。

7.Swift翻译教程系列——控制循环的流程的更多相关文章

  1. 3.Swift翻译教程系列——Swift基础知识

    英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是 ...

  2. Swift新手教程系列5-函数+selector在swift中的使用方法

    原创blog.转载请注明出处 近期在用swift写代码,尽管遇到一些问题,可是代码量确实减了不少. swfit新手教程系列会随着我使用swfit中的积累,不断地去修正更新 之前的教程 swift单例模 ...

  3. Swift中文教程(三)--流程控制

    原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花 ...

  4. struts2官方 中文教程 系列十二:控制标签

    介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...

  5. Windows 8实例教程系列 - 布局控制

    原文:Windows 8实例教程系列 - 布局控制 与传统应用类似,Windows store应用允许开发人员通过布局控件管理应用UI. 本篇将讨论Windows8布局设计控制. Windows 8布 ...

  6. python系列八:Python3条件控制&循环语句

    #!/usr/bin/python #-*-coding:gbk-*-#Python3 条件控制&循环语句import randomage = int(input("请输入你的年龄: ...

  7. IT兄弟连 Java语法教程 流程控制语句 控制循环结构1

    Java语言没有提供goto语句来控制程序的跳转,这种做法提高了程序流程控制的可读性,但降低了程序流程控制的灵活性.为了弥补这种不足,Java提供了continue和break来控制循环结构.除此之外 ...

  8. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  9. Node.js教程系列~目录

    Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...

随机推荐

  1. isset,empty,is_null小知识

    <?php /** 在这项研究开始时,有那么多的人不能很好的运用isset,empty,is_null正确null,false等待值回报值做出正确的推理,在这里,我自己总结通过学习小知识,随后的 ...

  2. NFS 配置服务

    NFS 配置服务 北京市海淀区  张俊浩 一.NFS.即网络文件系统(Network File System,NFS).一种使用于分散式文件系统的协议,由升阳公司开发.于1984年向外发布.功能是通过 ...

  3. Nexon由Xsolla全球支付服务

    韩国游戏公司纳克森决Nexon定从今年10月1日起,与Xsolla开展Playspan的合作,向全球提供更好的服务. 当Nexon的玩家随时想购买NX点数的时候.Xsolla的服务能够进入程序,让您的 ...

  4. UVa10000_Longest Paths(最短路SPFA)

    解题报告 求最长路. 用SPFA求最长路,初始化图为零,dis数组也为零 #include <iostream> #include <cstdio> #include < ...

  5. 允许debian wheezy支持IOS7+的iphone.

    IOS更新, 连接到数据线,不能使用 我想复制iphone照片只能用于内itunes对?  于linux这里面其实很容易处理. 在这里,我们使用了一个相对较新的组件libimobiledevice 为 ...

  6. Android技术——切换视图(两)随着ViewPage达到Tab幻灯片浏览

    Android技术--切换视图(一)~(四)在资源项目:https://github.com/YongYuIT/MeiNv_Liulanqi 一.早期android(android.support.v ...

  7. 恢复SQLServer实例连接

    原文:恢复SQLServer实例连接 译自: http://www.mssqltips.com/sqlservertip/2682/recover-access-to-a-sql-server-ins ...

  8. 2014ACM上海邀请赛A解释称号

    #include <cstdio> #include <cstring> #include <iostream> using namespace std; cons ...

  9. Codeforces Round #107 (Div. 2)---A. Soft Drinking

    Soft Drinking time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  10. window.open的小技巧分享(转)

    今天再次谈起window.open是因为发现了一个比较好玩的小技巧,详细内容我们稍后详细说明.       聊到window.open,不得不说明一下他的使用方法,主要有两种形式:   window. ...