简介
这是一个Swift语言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,会为你介绍Swift编程非常基础的内容。从电脑如何工作的全程基本原理到语言结构,你会足够了解这门语言,来处理数据和管理代码的行为。
快速链接
- 一个下午让你掌握Swift基础 ( 1/9 ) 编程本质 & Playground基础
- 一个下午让你掌握Swift基础 ( 2/9 ) 变量 & 常量
- 一个下午让你掌握Swift基础 ( 3/9 ) 数字类型 & 操作
- 一个下午让你掌握Swift基础 ( 4/9 ) 字符串
- 一个下午让你掌握Swift基础 ( 5/9 ) 做判断
- 一个下午让你掌握Swift基础 ( 6/9 ) 重复步骤
- 一个下午让你掌握Swift基础 ( 7/9 ) 函数
- 一个下午让你掌握Swift基础 ( 8/9 ) 闭包
- 一个下午让你掌握Swift基础 ( 9/9 ) 可选值
- Swift 初学者 ( 10/12 ) 数组
- Swift 初学者 ( 11/12 ) 字典
- Swift 初学者 ( 12/12 ) 集合
在前面一篇文章里,你学习了如何控制执行流程,通过发挥 if 和 switch 语句做决定的强大能力。这篇文章里,你会继续学习如何控制执行流程,这次使用循环语句。
循环语句可以让你多次执行同样的操作。这听起来好像不是很有趣也不是很重要,但循环在电脑程序里非常常见的。
例如,你可能有代码要从云端下载一张图片;用一个循环,你可以运行多次来下载整个照片库。或者你有一个拥有多个被电脑控制的角色的游戏,你可能需要一个循环来挨个走一遍来确保他们知道下一步该干什么。
上车吧!
Ranges
你在深入挖掘循环语句本身之前,你需要知道另一种数据类型叫做 Range,可以表示一系列数字。
让我们看看两种Range。
第一种,是 closed range ,你可以这样表示:
let closedRange = 0...5
三个点(...)表示range是closed(闭),意味着这个range从0到5,同时也包括0和5。也就是数字 (0, 1, 2, 3, 4, 5)。
第二种,是 half-open range,像这样表示:
let halfOpenRange = 0..<5
这里你用两个点替换三个点以及一个小于号(..<)。Half-open(半开)意味着range从0到5,包括0但不包括5。也就是数字(0, 1, 2, 3, 4)。
你可以用ranges来简化许多操作。例如,想一下前一篇文章的 switch 语句,用来把一天的一个小时转换到表示这天某一部分的字符串。你可以用 ranges 像这样重写它:
let hourOfDay = 12
let timeOfDay: String
switch (hourOfDay) {
case 0...5:
timeOfDay = "清晨"
case 6...11:
timeOfDay = "上午"
case 12...16:
timeOfDay = "下午"
case 17...19:
timeOfDay = "晚上"
case 20..<24:
timeOfDay = "夜深了"
default:
timeOfDay = "这他妈不是时间!"
}
这样看起来就比把所有情况每个都单独写出来更简明了。
你需要知道 ranges 因为在这篇文章的重点-循环里很常用,意味着文章剩下的部分也都会贯穿使用 ranges!
循环
循环是 Swift 多次执行代码的方式。在接下来的部分,你会学习两种 Swift 里可用的循环变体:for 循环和 while 循环。如果你了解另一门编程语言,你会找到概念,甚至觉得语法很熟悉。
For 循环
首先,让我们看看 for 循环。这应该是你会用到的最常用的循环啦,你用它们运行指定次数次代码,每一级都增加计数。
像这样构建一个 for 循环:
for <变量> in <RANGE> {
<循环代码>
}
循环用 for 关键字开始,跟着一个名字给循环变量(大部分都很短),然后是 in,然后是循环遍历的range。
这是一个例子:
let count = 10
var sum = 0
for i in 1...count {
sum += i
}
在上面的代码里,for 循环从 1 到 count 重复range。在循环的第一次重复,i 会等于range的第一个元素。这个例子里是 1。每次环绕循环,i 会增长到它终于等于 count 了,然后循环执行最后一次,然后就结束啦。
注意:如果用的range是 half-open range 然后最后一次循环可以看到 i 等于 count - 1。
循环里,你把 i 加到 sum 变量上。
scope 方面的知识,i 变量只在 for 循环 scope 里面才可见,意味着循环外不可用。
循环运行 10 次来计算队列 1 + 2 + 3 + 4 + 5 + ... 一直加到10。
这是每次重复变量的值:
- 重复1前: i = 1, sum = 0
- 重复1后: i = 2, sum = 1
- 重复2后: i = 3, sum = 3
- 重复3后: i = 4, sum = 6
- 重复4后: i = 5, sum = 10
- 重复5后: i = 6, sum = 15
- 重复6后: i = 7, sum = 21
- 重复7后: i = 8, sum = 28
- 重复8后: i = 9, sum = 36
- 重复9后: i = 10, sum=45
- 重复10后: i = 11, sum=55
注意:如果你数学很好,你可能会注意到这个例子计算了三角数(triangle numbers)。这是一个快速解释:http://bbc.in/1O89TGP
Xcode 的 playground 给了你好用的方式来可视化这样的重复。鼠标扫过结果边栏里 sum += i 那行,你会在右边看到一个白点。鼠标划过那个点上面来显示一个(+)按钮:
点一下这个加号(+)按钮,Xcode会在playground代码编辑器里这行的下面显示一个图标:
这个图表可以让你在循环重复的时候让 sum 变量可视化。
最后,有时候你只想循环指定次数,所以你根本不需要用循环变量。那个例子里,你可以再雇用下划线一次,像这样:
let count = 10
var sum = 1
var lastSum = 0
for _ in 0..<count {
let temp = sum
sum = sum + lastSum
lastSum = temp
}
这个循环不需要循环变量;循环只是简单地运行了指定次数。这个例子里,range是从 0 到 count 并且是 half-open的。这是写运行指定次数的循环的常用方式。
While循环
下一个循环的类型持续重复直到(only while)一个特定情况是true。
正因如此,它被称作 while循环。
像这样创建一个 while 循环:
while <情况> {
<循环代码>
}
每个重复,循环都会检测情况。如果情况是 true,然后循环会执行并且移动到另一次重复。如果condition是 false,循环就停止了。就像 for 循环和 if 语句,while 循环也引入了一个scope。
最简单的 while 循环用这个形式:
while true {
}
这是一个 while 循环,永远都不会停止,因为情况永远都是 true。当然,你永远都不会写这样一个 while 循环,因为你的程序会永远都在快速转动!这个情况被称作无限循环(infinite loop),尽管可能不会导致你的程序崩溃,但很有可能导致你的电脑死掉。
这是 while 循环一个更实用的例子:
var sum = 1
while sum < 1000 {
sum = sum + (sum + 1)
}
这个代码计算了一个数学队列,知道值超过1000那个点为止。
循环像这样重复:
• 重复1前: sum = 1, loop condition = true
• 重复1后: sum = 3, loop condition = true
• 重复2后: sum = 7, loop condition = true
• 重复3后: sum = 15, loop condition = true
• 重复4后: sum = 31, loop condition = true
• 重复5后: sum = 63, loop condition = true
• 重复6后: sum = 127, loop condition = true
• 重复7后: sum = 255, loop condition = true
• 重复8后: sum = 511, loop condition = true
• 重复9后: sum = 1023, loop condition = false
第九次重复后,sum 变量是 1023,因此循环情况 sum < 1000 变成了 false。在这个点,循环终止了。
Repeat-while循环
另一个while循环的变种叫做 repeat-while loop。它和 while 循环的区别是在循环的结束评估情况,而不是开头。
像这样构建一个 repeat-while 循环:
repeat {
<循环代码>
} while <情况>
这是上一个部分的例子,但使用了一个 repeat-while 循环:
var sum = 1
repeat {
sum = sum + (sum + 1)
} while sum < 1000
这个例子里,输出和之前是一样的。但是,不总是都这样-你可能用不同的情况来获得不同的结果。
想想下面的 while 循环:
var sum = 1
while sum < 1 {
sum = sum + (sum + 1)
}
现在想想相应的 repeat-while 循环,使用了同样的情况:
var sum = 1
repeat {
sum = sum + (sum + 1)
} while sum < 1
在常规 while 循环的例子里,sum < 1 的情况从开始就是 false。意味着并不会到达循环主体!sum的值会等于1,因为循环没有执行任何重复。
但在 repeat-while 循环的例子里,sum 会等于 3 因为循环会执行一次。
跳出循环
有时候你想早点跳出一个循环。你用 break 关键字来这样做,立即终止循环的执行然后继续到循环之后的代码。
例如,想想下面的代码:
var sum = 1
while true {
sum = sum + (sum + 1)
if sum >= 1000 {
break
}
}
这里,循环情况是 true,所以循环正常的话会永远重复。
但是,break 意味着 while 循环会在 sum 一旦大于等于1000的时候退出。漂亮!
你已经看到了用电脑编程示范如何用不同的方式来写同样的循环,总有很多方式来达成同样的结果。你应该选择读起来最容易的方法并且用尽可能好的方式来传达你的意图,有了足够的时间和练习后你会内在的一个方法。
注意:break 关键字在 for 循环里也有效,和它在 while 循环里的方式完全相同。
continue 关键字和 labeled statements
有时候你希望能终止一个循环重复。例如,如果你在遍历一个 range 希望跳过所有奇数,但不想跳出整个循环-你只想跳过当前重复但让循环继续(continue)。
你可以用 continue 关键字来这么做,立即终止当前循环的重复并且开始下次重复。
要示范一下,我会用一个国际象棋棋盘为例,这是一个8乘8的格子,每个小方格有一个值,是行跟列的乘积,就像一个乘法表格:
第一个代码例子会计算所有方格的总和,不包括所有偶数行。给个插图,它会计算下面方格的总和:
像下面这样使用一个 for 循环,你就可以获得它:
var sum = 0
for row in 0..<8 {
if row % 2 == 0 {
continue
}
for column in 0..<8 {
sum += row * column
}
}
当行模除 2 等于 0 的时候,就是偶数行。这个例子里,continue 让 for 循环跳到下一行。
就像 break,continue 同时对 for 循环和 while 循环都有效。
第二个代码例子会计算所有方格的总和,不包括列大于等于行的方格。给个插图,它会计算下面方格的总和:
像下面这样使用一个 for 循环,你就可以获得它:
var sum = 0
rowLoop: for row in 0..<8 {
columnLoop: for column in 0..<8 {
if row == column {
continue rowLoop
}
sum += row * column
}
}
最后一个代码块利用了 labeled statements(标签语句),给两个循环分别加了标签,rowLoop 和 columnLoop。当行在内部 columnLoop 等于列的时候,外部 rowLoop 会继续(continue)。
你可以像这样使用 labeled statements ,在你喜欢的时候用 break 来跳出指定的循环。一般的,break 和 continue 用在最内侧的循环,所以如果你想操作一个更外部的循环的时候就需要用 labeled statements。
关键点
- 你可以使用 ranges 来创建一些列数字,从一个值递增到另一个。
- Closed ranges 同时包含开始和结尾值。
- Half-open ranges 包含开始值并且在结尾值前一个停止。
- 循环让你可以执行同样的代码好几次。
- break命令可以让你跳出循环。
- continue 命令让你结束当前循环的一个重复,然后开始下一次重复。
- Labeled statement 可以让你对一个外部循环使用 break 和 command。
接下来去哪儿?
经过之前的几篇文章,你已经学会处理数据的核心语言特色-从数据类型到变量,然后到利用布尔型和利用 ranges 的循环做决定。
在接下来两篇文章,你会学习让代码更可复用和更容易阅读的核心方式,通过使用函数和闭包。
挑战
A挑战:预测结果
sum 的值会是什么以及会发生多少次重复?
var sum = 0
for i in 0...5 {
sum += i
}
aLotOfAs 里会有多少字符“a”的实例?
var aLotOfAs = ""
while aLotOfAs.characters.count < 10 {
aLotOfAs += "a"
}
介绍
欢迎来到Swift世界!Swift是一门苹果在2014年夏天发布的编程语言。从那之后,Swift发布了一个主要的版本跳跃,成为了开始在苹果平台:iOS,OS X,watchOS和tvOS开发的最简单的方式。
谁适合这篇教程
这篇教程适合懂一点编程、并且希望学习Swift的人。也许你已经为网站写过一些JavaScript代码,或者用Python写过一些简短的程序。这篇教程就是为你准备的!你会学习到编程的基本概念,同时也会成为Swift语言小能手。
如果你是赤裸裸的编程新手,这篇教程也是为你准备的!教程里贯穿有简短的锻炼和挑战来给你一些编程练习,同时测试你的知识。
需要准备什么
要看这篇教程,你需要准备如下的东西:
- 一台运行OS X El Captian(10.11)的Mac,带有最新发布的更新并且安装了安全补丁。这样你才能够安装需要的开发工具:最新版本的Xcode。
- Xcode 7.3 或更新的版本。Xcode是用Swift写代码的主要开发工具。最小也需要Xcode 7.3版本,因为那个版本包含Swift 2.2。你可以免费从Mac App Store下载Xcode的最新版本,这里:http://apple.co/1FLn51R。
如果你还没有安装Xcode最新版本,在继续看下面的教程前要确定安装。
如何使用这篇教程
每篇教程都会介绍触手可及的话题理论,伴随大量Swift代码来示范在学习的实际的应用程序。
教程里的所有代码都是平台中立的;这意味着不是为iOS、OS X或任何其它平台而特定。代码在playgrounds里运行,你在本篇中已经学习了。
在剩下的教程里,你可以把代码在自己的playground里输入进去。这样你就可以和代码“玩耍”(play around),做一些改变立即就能看见代码运行的结果。
剩下的教程里会贯穿实际小练习,都是简短的练习,关于触手可及的主题。每篇的末尾也有挑战,会有编程问题也会有长一点的代码练习来测试你的知识。做完就能掌握大部分的Swift基础知识。
教程更新
教程会随Swift语言的更新而更新,会发布在我的简书和知乎专栏上,搜索“张嘉夫”即可关注我。
目录
本教程从一些基础工作开始来让你起步:
- 第1篇,编程本质 & Playground基础 - 这就是,到编程世界的入门介绍!你会从电脑和编程的预览开始,然后剩余时间给Swift playground打个招呼。
- 第2篇,变量 & 常量 - 你会学习到变量和常量,这是用来存储数据的“地方”。你也会学习数据类型以及Swift如何追踪数据类型并在代码中进行传输。
- 第3篇,数字类型 & 操作 - 你会从基础的数字类型比如整形和浮点型数字开始,当然也包括布尔类型。也会看到一些在实际操作,从比较到算数操作如加减。
- 第4篇,字符串 - 用字符串来存储文字-从按钮里的文字到图片的标注到这篇教程全部的文字,存储这所有的一切!你会学习到string和character类型,以及基于这些类型的一些常见操作。
在脑海中有基础数据类型后,就该用那些数据做一些事情了:
- 第5篇,做判断 - 代码不总是直接从头运行到尾。你会学习在代码里如何做判决并且设定情况来运行某段代码。
- 第6篇,重复步骤 - 继续不要让代码直线运行的主题,你会学习到如何使用循环来重复某些步骤。
- 第7篇,函数 - 函数是Swift中用来构建代码的基础建筑。你会学习到如何定义函数来分组代码到可复用单元中。
- 第8篇,闭包(Closures) - 闭包和函数很接近。你会学习到如何使用它们来轻松传递代码块。
最后一篇会回到数据:
- 第9节,可选值 - 这篇讲可选值,Swift中的一种特殊类型,表示既有可能是一个真实的值也有可能没有值。这篇的最后你会知道为什么要用可选值以及如何安全地使用它们。
这些基础会让你快速开始Swift之路,做好接触更高级编程主题的准备。
网友评论