简介
这是一个Swift语言教程,更新至 iOS 10,Xcode 8 和 Swift 3,会为你介绍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 ) 集合
在第一篇里,你会学习一些基础。先学习代码是如何运作的,再学习使用写Swift代码的工具。
电脑是怎么工作的
你可能不太相信,但电脑本身就是个智障。电脑的强力都是因为像咱们这样的人编程才能驱动。要想很成功地利用电脑的能力——既然你都看这篇文章了我猜你也是这么打算的——理解电脑是如何工作的非常重要。
你可能会惊讶,电脑本身其实就是一台简单的机器而已。电脑的心脏是中央处理单元(CPU)。其实它本质上是一台数学机器。用来做加减法和其它算数操作。操作电脑的时候,万物基于CPU,每秒“嘎吱嘎吱”咀嚼数字几百万次。这是都基于数字而已,是不是很神奇?
CPU把它操作的数字存在一个很小的叫做寄存器的存储器里。CPU可以从电脑里叫随机存取存储器(RAM)的主存储器中读取数字到寄存器中。它也能把存储在寄存器中的数字存储到RAM中。这让CPU能处理大量数据,而不会都挤在寄存器那里。
这是他们工作的示意图:
在CPU从RAM读取值到寄存器里的时候,它在数学单元中使用这些值,然后把结果保存回到另一个寄存器中。
每次CPU做加减法、一次从RAM的读取或一次向RAM的写入的时候,它在执行一条单独的指令(instruction)。每个电脑程序通常由数千到数百万行指令组成。一个复杂的电脑程序,比如你的操作系统,Mac OS X(是的,这也是一个电脑程序!),总共应该有数百万行指令。
写一条条单独的指令来告诉电脑该干嘛是完全有可能的,但即使是最简单的程序,这样都会极其耗时而且很单调乏味。因为大部分电脑程序的目标都是做一些远远要比小学数学要复杂的事情——电脑程序可以处理图片,还让你能网上冲浪以及和朋友聊天。
所以不是写一条条单独的指令,而是用一门特定的编程语言写代码,在这个情境中里就会是Swift啦。这些代码通过一个叫做编译器的电脑程序来实现,它把代码转换为CPU知道如何执行的指令。你写的每一行代码都会成为许多行指令——几行代码最终可能会是数十行指令!
表示数字
现在你知道了,数字是一台电脑的黄油和面包,是它做所有事情的基础。不论你给编译器什么信息,最后都会变成数字。例如,一个代码块里文字的每个字符最终其实都由数字来表示。你在第4篇文章里会学习到更多相关内容,探索字符串,这是用来表示一块文字的计算机术语。
图片也不例外:电脑里,每张图片也都是由一系列数字表示的。一张图片被分为数千甚至数百万块,每一块叫做像素,这里每个像素都是一种纯色。如果你贴近看电脑屏幕,你应该可以辨别出每一块。除非你有一个特别高分辨的显示器,每个像素都太他妈小了!每个这些纯色像素通常都由三个数字表示:一个表示红色的含量,一个表示绿色的含量还有一个表示蓝色的含量。例如,一个完全红色像素会是100%红色,0%绿色和0%蓝色。
CPU处理的数字和你过去用的尤其不同。日常生活里你和数字打交道,都用基数10,也被叫做十进制系统。你已经使用这种数字系统这么久了,凭直觉你也会知道它怎么用,但还是让我们再仔细看看原理,这样可以从CPU视角来体会一下。
十进制或基数10的数字423包含三个个位、两个十位和四个百位:
在基数10系统里,每一位数字可以是0,1,2,3,4,5,6,7,8或9,每一位都共有十种可能性。必须的,这就是它为什么被称作基数10!
但每一位真实表示的值都由它在数字里的位置决定。从右边移动到左边,每个数字都与不断增加的10的幂数相乘。所以最右端位置的乘数是10的0次方,就是1。往左移,下一个乘数是10的1次方,就是10。再次往左移动,下一个乘数是10的2次方,就是100。然后继续。
这意味着每位是它在右侧的值的10倍。数字423因此等于:
(0 * 1000) + (4 * 100) + (2 * 10) + (3 * 1) = 423
二进制数字
因为你一直被训练使用基数10,所以不需要思考如何读大部分数字——感觉很自然。但对于电脑来说,基数10实在太复杂了!电脑都是智障,记得吗?他们喜欢用基数2。
基数2通常被称为二进制,你之前就应该听过它吧。注意基数2每一位只有两个选项:0或1。
几乎所有现代计算机都用二进制,因为在物理层每一位数字只处理2个选项是最简单的。电脑大部分是由数字电路系统组成的,电流存在是1,不存在是0——这就是基数2!
注意:曾经有些真实的或幻想出来的电脑使用三进制系统,它们有3个可能值而不是2个。电脑科学家、工程师和职业黑客继续在探索基数3电脑的可能性。可以看https://en.wikipedia.org/wiki/ Ternary_computer和http://hackaday.com/tag/ternary-computer/。
这是基数2数字1101的表示:
在基数10数字系统里,值的乘数是10的次方:1,10,100,1000,等等。但在这里,你会发现它们值的乘数是2的次方:1,2,4,8,16,等等。主要原则就是用不断增长的基数的次方作为乘数——这种情况下就是2的次方——从右向左移动。
所以最右一位表示(1 * 2^0),就是(1 * 1),就是1。左边下一位表示(0 * 2^1),就是(0 * 2),就是0。上面的插图里,可以每一块上方看到2的次方。
换种方式说,每一位的乘数要么是1要么是0,这就是二进制数字的组成部分。十进制版本的二进制数就是把所有2的次方结果相加,组成新的数字。所以二进制数字1101等于:
(1 * 8) + (1 * 4) + (0 * 2) + (1 * 1) = 13
如果你想把基数10数字423转为二进制,只需要把423拆为由2的次方组成。你会得到:
(1 * 256) + (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (0 * 8) + (1 * 4) + (1 * 2) + (1 * 1) = 423
可以看到,扫视一下上方等式的二进制位数,结果的二进制数字是110100111。你可以自己做数学,证明这和423相等!
二进制每一位的计算机术语叫做比特(bit)。8个比特组成一个字节(byte)。4个比特被称作nibble,一个文字游戏可以看出即使是老派的计算机科学家也很幽默。
电脑的有限的内存意味着它能处理的数字最大长度是固定的。举个例子,每个寄存器通常是32或64个比特长度,所以我们常说32位和64位CPU。
因此,32位CPU可以处理最大基数10数字4,294,967,295,就是基数2数字 11111111111111111111111111111111。一共32个1——数数看!
电脑其实可以处理比CPU能处理的最大数字还要大的数字。但计算会被分割,用一种特别的、更长的方式管理,很像你在学校算的长乘法算式。
十六进制数字
可以想象,用二进制数字会变得非常单调乏味,因为写或记录它们会要很长时间。所以,在电脑编程里我们通常会使用另一种数字格式叫做十六进制,简写是hex。这就是基数16。
当然,每一位没有各不相同的16个数字;只有10个。所以要补充一下,我们用前6个英文字母,a 到 f 。它们和这些十进制数字相等:
- a = 10
- b = 11
- c = 12
- d = 13
- e = 14
- f = 15
这是一个用和刚刚说的格式的基数16例子:
首先注意你可以创造看起来就像单词一样的16进制数字。这意味着可以找到一点乐趣。:]
现在每一位的值都和16的次方结果相关。和之前一样的方式,你可以像这样把它转化到10进制:
(12 * 4906) + (0 * 256) + (13 * 16) + (14 * 1) = 49374
翻译字母到相等的十进制值,然后计算一下。
但为什么要这么烦呢?
16进制很重要,因为每个16进制位都恰好能表示4位2进制。二进制数字1111和16进制的f相等。因此,你可以简单地串联二进制来表示每位16进制,创造一个比相等的二进制或十进制要短的16进制数。
举个例子,想想上面的数字c0de:
c = 1100
0 = 0000
d = 1101
e = 1110
c0de = 1100 0000 1101 1110
这样会变得非常有帮助,给出了电脑是如何使用32位或64位长的二进制数字的。回想最长的32位数字在十进制里是4,294,967,295。十六进制里是ffffffff。看起来清晰、简洁地多。
代码如何工作
电脑有很多限制,它们自己只能做一些很小的事情。程序员通过代码为电脑添加的能力,把这些小事情按照正确的顺序组装到了一起,来做一些远远更伟大的事情。
代码很像写食谱。收集原料(数据)然后给电脑一个按步骤操作的食谱告诉它怎么使用原料。
这是一个例子:
第1步。从硬盘加载照片。
第2步。改变照片大小为400像素宽、300像素高。
第3步。对照片使用sepia滤镜。
第4步。打印照片。
这就是传说中的伪代码。它不是由有效的电脑编程语言写出来的,但它表示了你想使用的算法。这个例子里,算法拿到了一张照片,改变了大小,加了一个滤镜然后打印了它。这是相对简单的算法,但至少也是个算法呀!
Swift代码就是像这样的:一个一步步来的电脑指令清单。在你看接下来的文章的时候,这些指令会变得越来越复杂,但原则是相同的:你只要简单地告诉电脑该干嘛,一次一小步。
每门编程语言是用高级、预定义的方式来表达这些步骤。编译器知道如何解释你写的代码然后把它转化为CPU能执行的指令。
有许多不同的编程语言,每个都有自己的优点和缺点。Swift是一门非常现代化的语言并且它还只在开发的起步阶段。它对许多其他语言取其精华去其糟粕。在未来的几年里,我们再回看Swift也会觉得老、生硬。但是现在,它是一门非常令人激动的语言,因为它在快速进化。
以上是关于电脑硬件的一个简短游览,数字表示、代码以及他们一起如何创造一个现代化程序。但这里根本不够讲!如果你继续看这篇文章的话,现在是学习你用来写Swift的工具的时间了。
Playgrounds
用来写软件的工具集通常被叫做工具链。工具链中用来写代码的部分叫做集成开发环境(IDE)。Swift最常用的IDE叫做Xcode,也就是你即将要使用的。
Xcode有一个好用的特色叫做Playground,可以让你快速写然后测试代码,而不用构建一个完整的app。我在接下来的Swift教程中都会用playground来练习代码,所以理解它如何工作很重要。这就是你在这篇文章的剩余部分会学习的东西。
创建一个Playground
当你打开Xcode,它会用下面的欢迎界面向你打招呼:
如果你看不到这一屏,非常有可能是因为“Show this window when Xcode launches”选项被勾掉了。你也可以按Command-Shift-1来打开屏幕,或者点击菜单栏里的Window\Welcome to Xcode。
从欢迎屏里你可以快速跳到一个playground里,通过点击Get started with a playground。现在点一下,Xcode会带你到一个新的屏幕:
在这里,你可以命名playground然后选择你的目标平台。名字只是用来装点门面的,自己用的;当你创建playground的时候,放松选择一个可以帮助你记住它是关于什么内容的名字。例如,当你在学习第2篇教程的时候,你可能想命名这个playground为Tutorial2。
这儿能看到的第二个选项是平台。现在既可以选择iOS或Mac。
你选择的那个只是简单地定义Xcode将要用哪个模板创建playground。每个平台都有它们自己的环境设置,为你准备好到那个平台去和代码玩耍(play around)。因为这篇教程的特点,随便你选哪个,反正你也不会写特定平台的代码。你要学习的是Swift语言的核心理念!
当你选择好一个名字和一个平台后,点击Next然后保存playground。Xcode然后会为你展示playground,像这样:
Playgrounds预览
第一眼看上去,playground就像一个高级记事本。好吧,告诉你一个大新闻:实际上它就是!
上面的截图标明的部分是首先需要知道的事也是最重要的事:
- 源编辑器。这是你写Swift代码的地方。这很像一个文本编辑器比如Notepad或文本编辑(TextEdit)。你会看到叫做单间隔字体的使用,意味着所有字符都一样宽。这让代码读起来更轻松。
- 结果边栏。这个区域显示你的代码运行的结果。看完全部教程后,你会学到更多代码是如何执行的。结果边栏会是查看来确定代码的确是预想地那么工作的主要区域。
- 执行控制。Playgrounds默认自动执行代码,意味着你可以写代码,然后立即看到输出的结果。这个控制让你可以再次执行一遍playground代码。按住按钮可以在自动执行和手动执行模式之间切换。
- 活动查看器。它显示了playground的状态。在截图里,它显示playground已经执行完,准备好在源编辑器里处理更多代码。playground在执行的时候,这个查看器会指示一个菊花。
- 版块控制。这些开关决定显示和隐藏3个版块,一个显示在左边,一个在底部还有一个在右边。这些版块每个都显示一些你可能需要时时访问的额外信息。通常会让它们保持隐藏,就像它们在截图里那样。继续读本书的时候你会学习到关于每个版块更多的内容。
Playground从上到下执行源编辑器里的代码。每次你改变代码,playground会重新执行所有代码。当然你也可以强行重新执行一遍,通过点击Editor\Execute Playground。不然你也可以使用执行控制。
你也可以打开源编辑器里左侧的行号,通过点击Xcode \Preferences...\Text Editing\Line Numbers。行号在想参考某部分代码的时候会很有用。
一旦playground执行完毕了,Xcode会更新结果边栏来在源编辑器里显示相应行的结果。当你看完所有Swift教程后,会知道如何解释代码执行的结果。
关键点
- 电脑在最基本的级别只执行简单的算数。
- 编程语言让你能写代码,代码可以被编译器转换到CPU能够执行的指令。
- 电脑用基数2形式来操作数字,也就是熟知的二进制。
- 写Swift代码的编辑器叫做Xcode。
- 通过提供代码是如何执行的及时反馈,playground让你能快速、有效地写并且测试Swift代码。
介绍
欢迎来到 Swift 初学者,完全更新到 Swift 3!
自从在2014年发布,Swift 已经经历了两个主要的版本,并且是开始为苹果平台做开发最简单的方式:iOS,macOS,watchOS 和 tvOS。随着在2015年底完全开源,它开始传播到其它平台,比如 Linux。
Swift 对于准备开始编程的人来说是一个绝佳的选择,因为 Xcode 提供了一个沙盒类型的环境,你可以直接执行 Swift 语句来尝试语言的多个元素——而不用先创建一个完整的app。
尽管 Swift 对于学习编程是一个绝佳的语言,它也是一个工业级的语言,全世界的开发者用来为 iPhone、iPad、Mac、Apple TV和Apple Watch开发数千种神奇的app。这意味着你在这本书里学到的东西会在你扩展开发技能的时候很有用,并且对日后可能成为一个 app 开发者也很有用。
你会学习基础的东西例如常亮、变量和类型,然后移步更多更复杂的东西比如数据结构、类和枚举,并且以一些深入知识结尾,关于协议扩展、自定义操作符和面向协议编程,很多主题和其它语言类似,另外一些 Swift 用与众不同的方式来提供。
Swift 也充满了乐趣!在测试新创意的时候可以很随意地尝试一小段代码并且和不同的值一起玩耍。编程是一个需要切身实践的体验,Swift 让你可以很快很轻松地跟随本书一起做,也可以探索自己的。
这篇教程是写给谁的
如果你是一个完全编程新手,这就是为你准备的教程!贯穿本书有短的练习和挑战来给你一些编程实践,也一起测试你的知识。
你需要什么
要跟上这篇教程,你需要如下的东西:
- 一台运行OS X El Captian(10.11)的Mac,带有最新发布的更新并且安装了安全补丁。这样你才能够安装需要的开发工具的最新版本:Xcode。
- Xcode 8 或更新的版本。Xcode是用Swift写代码的主要开发工具。最小也需要 Xcode 8 版本,因为那个版本包含Swift 3。你可以免费从Mac App Store下载Xcode的最新版本,这里:http://apple.co/1FLn51R。
如果你还没有安装Xcode最新版本,在继续看下面的教程前要确定安装。这篇教程包含的代码基于 Swift 3 和 Xcode 8——如果你用一个老版本来进行会很快就迷失掉的。
如何使用这篇教程
每篇教程都会介绍手头的话题理论,伴随大量Swift代码来示范在学习的实际的应用程序。
因为这是一本初学者的教程,我们推荐第一次阅读按顺序来。在那之后,这篇教程将为你提供一个很好地参考,以恢复和刷新你有关特定主题的记忆。
教程里的所有代码都是平台中立的;这意味着不是为iOS、macOS 或任何其它平台而特定。代码在playgrounds里运行,你会在第一篇中学习到。
在你跟随本教程阅读的时候,你可以跟着把代码打到你自己的 playground 里。这意味着你将能够通过做改变并且立即看见结果来和代码玩耍。
你会在贯穿本书的过程中发现迷你练习,是关于手头的主题的简短练习。每篇文章最后也有挑战,是编程问题或长的代码练习,来测试你的知识。
你会掌握本书的大部分,如果你跟着做每个练习和挑战的话。
教程更新
教程会随Swift语言的更新而更新,会发布在我的上,搜索“张嘉夫”即可关注我。
目录
这份教程被分为四个部分。每个部分有一个简短介绍,描述了它的章节、话题以及这部分的主旋律。
*###第一部分:Swift 基础
本教程的第一部分从非常初级的电脑环境开始:首先,电脑如何工作,然后 Swift 的 playground 特色是如何工作的。在这些后勤工作做完后,你会开始学习 Swift 语言的基础,然后学习管理数据、结构化代码、做简单操作和计算、使用类型的基础。
*###第二部分:集合类型
存储数据是所有 app 的核心部分,不论它是你的社交网络 app 里的朋友列表,还是你的击打游戏里的一组未解锁角色。在这个部分,你会学习如何在 Swift 里存储数据的集合。
*###第三部分:建立自己的类型
Swift 配备了基本的模块,但它的真正的力量是在自定义的东西,你可以建立你的 app 的模型部分。
*###第四部分:高级主题
本教程的最终部分包含 Swift 里更多高级主题。你会学习
本教程从一些基础工作开始来让你起步:
- 第1篇,编程本质 & Playground基础 - 这就是,到编程世界的入门介绍!你会从电脑和编程的预览开始,然后剩余时间给Swift playground打个招呼。
- 第2篇,变量 & 常量 - 你会学习到变量和常量,这是用来存储数据的“地方”。你也会学习数据类型以及Swift如何追踪数据类型并在代码中进行传输。
- 第3篇,数字类型 & 操作 - 你会从基础的数字类型比如整形和浮点型数字开始,当然也包括布尔类型。也会看到一些在实际操作,从比较到算数操作如加减。
- 第4篇,字符串 - 用字符串来存储文字-从按钮里的文字到图片的标注到这篇教程全部的文字,存储这所有的一切!你会学习到string和character类型,以及基于这些类型的一些常见操作。
在脑海中有基础数据类型后,就该用那些数据做一些事情了:
- 第5篇,做判断 - 代码不总是直接从头运行到尾。你会学习在代码里如何做判决并且设定情况来运行某段代码。
- 第6篇,重复步骤 - 继续不要让代码直线运行的主题,你会学习到如何使用循环来重复某些步骤。
- 第7篇,函数 - 函数是Swift中用来构建代码的基础建筑。你会学习到如何定义函数来分组代码到可复用单元中。
- 第8篇,闭包(Closures) - 闭包和函数很接近。你会学习到如何使用它们来轻松传递代码块。
最后一篇会回到数据:
- 第9节,可选值 - 这篇讲可选值,Swift中的一种特殊类型,表示既有可能是一个真实的值也有可能没有值。这篇的最后你会知道为什么要用可选值以及如何安全地使用它们。
这些基础会让你快速开始Swift之路,做好接触更高级编程主题的准备。