简介
这是一个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 ) 集合
现在你知道该如何声明常量和变量了,是时候学习如何用操作(operations)来处理数据了。如果不对数据做点什么那它还有什么用呢?
对数字的加减和其它简单操作对于所有电脑编程都是极为重要的。毕竟就像你在第一篇文章里学的,电脑的所有操作都起源于算术。
在这篇文章里,你会学习到如何用Swift来对数字进行基本的算术操作。也会学习布尔型(Booleans),代表了true和false值,以及怎么用它来比较数据。
算术操作
当你调用一个或多个数据,然后把它转换为另一个数据的时候,这就叫操作。
理解操作的最简单方式就是想想算术。加法操作用了两个数字然后把他们转换为两个数字的和。减法操作用了两个数字,转换他们为两个数字的差。
你的app里会遍布简单的算术;从计算一篇帖子的“赞”的个数到计算一个按钮或窗口的正确尺寸和位置,数字事实上无处不在!
在这个部分,你会学习到多种算术操作,他们是Swift考虑到对于数字的应用而提供的。在后面的文章里,你会学习到将不只是数字的操作。
简单操作
Swift里所有操作用一个叫做操作符(operator)的符号来表示操作的类型。事实上,你已经看过一个操作符了:等于号,=,就是赋值操作符(assignment operator),你曾经用来给变量或常量分配值。
想想你小时候在学校里学的四种算术操作:加减乘除。对于这些简单操作,Swift使用下面的操作符:
- Add(加): +
- Subtract(减): -
- Multiple(乘): *
- Divide(除): /
这些操作符是像这么用的:
let add = 2 + 6
let subtract = 10 - 2
let multiply = 2 * 4
let divide = 24 / 3
这些每个常量的结果都是同样的:8。你写代码来执行这些操作很像你在纸笔上做的。
如果你想,也可以移除操作符周围的空格,像这样:
let add = 2+6
但如果在操作符两边都加上空格通常情况下会更容易阅读。
你也可以让变量或常量自己发生操作。例如:
let two = 2
let six = 6
let add = two + six
或者你也可以混合起来匹配使用,像这样:
var add = 2
add = add + 6
这四个操作理解起来很容易,因为你这辈子里的大部分时间都在这么做。Swift也为你准备了更复杂的操作,所有这些都是标准的算术操作,就是不那么常见而已。现在让我们看看吧:
模除操作
第一个是模除(modulo)操作。除法里,分母是分子的整数倍,再加上余数。这就是模除操作可以提供的:余数。例如,10模除3等于1,因为10是3的三倍加上余数1。
Swift里,模除操作是%符号,像这样使用:
let modulo = 28 % 10
这个例子里,modulo等于8,因为28等于10的两倍加上余数8。
Swift里,你甚至可以对小数用模除操作,像这样:
let moduloDemical = 11.6 % 1.2
这个例子里,moduloDecimal等于0.8,因为11.6是1.2的九倍加上余数0.8。用脑袋计算小数模可能有一点棘手,所以如果它对你没有直接意义的话还是要花时间考虑考虑。
Shift操作
左shift和右shift操作用了实数的二进制形式,把数字各自左移或右移。然后返回新的二进制数字的实数形式。
例如,实数14在8位二进制里是00001110。向左移两位结果是00111000,就是实数的56。
这是在左移操作发生的事情:
用来填充右侧空白位置的数字变成了0。左端出去的数字都被丢掉了。
右Shift也一样,只是数字向右移。
这两个操作的操作符如下:
- 左Shift:<<
- 右Shift:>>
这是你看到过的第一个包含不止一个字符的操作符。事实上操作符可以被包含任意数量的字符。
这是使用两种操作符的例子:
let shiftLeft = 1 << 3
let shiftRight = 32 >> 2
这些值都等于数字8。
使用shifts的一个原因是让乘或除以二的幂数更轻松。注意左shifting一就等于乘以二,左shifting二就等你乘以四,以此类推。同样地,右shifting一就等于除以二,右shifting二就等于除以四,以此类推。
在过去的时代,代码经常使用这个把戏因为shifting几个比特对于CPU来说远远比复杂的乘法和除法算术要简单。因此代码用shifting会运行的更快。但现在的时代里,CPUs快了非常多、编译器甚至可以替你把乘和除转换为shifts。所以你只会在摆弄二进制的时候才会看到shifting,那么大概你永远也不会看到了除非你成为了一名嵌入式系统程序员!
自增和自减
你会需要的一个常规操作是要能够让一个变量自增或自减。在Swift里,已经被这样打包好了:
var counter = 0
count += 1
counter
//counter = 1
counter -= 1
counter
// counter = 0
counter变量从0开始。自增让它的值变成了1,然后自减让它的值变回了0。
这些操作符和赋值操作符(=)很像,除了他们还做了加或减。他们读取变量的当前值,加上或减去给出的值,然后把结果赋值给变量。
换句话说,上面的代码就是下面的代码的简写:
var counter = 0
counter = counter + 1
counter = counter - 1
相似的,*= 和 /= 操作符各自用相同的方式做了乘和除:
一次加或减的值不止一也是可行的:
var counter = 0
counter += 5
// counter = 5
counter -= 2
//counter = 3
var counter = 10
counter *= 3 //和counter = counter * 3相同
// counter = 30
counter /= 2 //和counter = counter / 2相同
// counter = 15
Swift中的操作顺序
当然,这和你计算一个值的时候很像,你会希望可以使用多个操作符。这是在Swift中如何完成的例子:
let answer = ((8_000 / (5 * 10)) - 32) >> (29 % 5)
注意括号的使用,Swift里有两个作用:让任何读这段代码的人看起来更清晰——包括你自己——你表示什么,消除歧义。例如,考虑下面的情况:
let answer = 350 / 5 + 2
这等于72(350除以5,然后加2)还是50(350除以7)?你们这些学校里的好同学肯定会尖叫“72!”那么你就答对了!
Swift通过使用叫做操作符优先级同样的推理得到这些。除法操作符(/)比加法操作符(+)有一个更高的优先级,所以这个例子里,代码首先执行了除法操作。
如果你想让Swift先做加法——就是返回50——那你像这样可以使用括号:
let answer = 350 / (5+2)
优先级法则就和你在学校里学的数学一样。乘和除有同样的优先级,高于加减,他们也有同样的优先级。
混合类型的操作符
到目前为止,你只看过用于单独整数或doubles的操作符。但如果你有一个整数希望乘以一个double怎么办呢?
你可能会幼稚的尝试这样做:
let hourlyRate = 19.5
let hoursWorked = 10
let totalCost = hourlyRate * hoursWorked
但如果你这么试看看,你会在最后一行得到一个error:
Binary operator '*' cannot be applied to operands of type 'Double' and 'Int'(二进制操作符'*'不能应用于类型'Double'和'Int'的操作数)
这是因为在Swift里,你不能把*操作符应用到混合类型里。这条原则对其他算术操作符也适用。刚开始可能觉得这看起来很意想不到,但Swift却是很有帮助的。
Swift强制你明确地表达你想做什么,当你希望一个Int乘以一个Double的时候,因为结果只能是一个类型。你希望结果是Int吗,在乘之前转换Double到Int?或者你希望结果是Double,在乘之前把Int转换为Double?
这个例子里,你希望结果是Double。你不想要Int,因为在那种情况下,Swift会转换hourlyRate到Int来完成乘法,把它取舍为19,所以就失去了Double的精度。
你需要告诉Swift你想要它考虑hoursWorked常量为一个Double,像这样:
let hourlyRate = 19.5
let hoursWorked = 10
let totalCost = hourlyRate * Double(hoursWorked)
现在Swift在乘每个操作数的时候它们每个都成为了Double,所以totalCosta也会是一个Double。
迷你练习
- 创建一个叫testNumber的常量,然后初始化为任意一个你喜欢的整数。然后,创建另一个常量叫做evenOdd,然后让它等于testNumber模除2。现在改变testNumber为多种数字。你观察evenOdd会注意到什么?
- 创建一个叫做anwser的变量,用0初始化它。让它自增1。然后给它加10。乘以10。然后,右shift 3。所有这些操作之后,答案是什么?
比较操作符
直到现在,你只见过Int和Double的数据类型。这些很有用,但是时候扩展范围学习另一个类型了,一个可以让你通过比较操作符来比较值的类型。
在你做一次比较的时候,例如找到两个数字中更大的一个,结果不是true就是false。Swift有一个数据类型就是干这个的!叫做Bool,Boolean(布尔型)的缩写,以一个发明了算术中关于true和false整个领域的相当聪明的男人George Boole命名的。
你在Swift里这样使用布尔型:
let yes: Bool = true
let no: Bool = false
因为Swift的类型推断,你可以省去类型:
let yes = true
let no = false
一个布尔型只能是true或false,由关键词true和false来表示。在上面的代码里,用关键词来设置每个常量的初始状态。
布尔操作符
布尔型一般用来比较值。例如,你可能有两个值想要知道他们是否相等:要么是(true)要么不是(false)。
Swift里,用相等操作符来做,由==表示:
let doesOneEqualTwo = (1 == 2)
Swift推理出doesOneEqualTwo是一个布尔型。很明显1不等于2,因此doesOneEqualTwo会是false。
相似的,也可以用 != 操作符来看看两个值是不是不相等:
let doesOneNotEqualTwo = (1 != 2)
这次,比较结果是true因为1不等于2,所以doesOneNotEqualTwo会是true。
还有两个操作符让你决定一个值比另一个大(>)或小(<)。你在数学里应该已经知道他们了:
let isOneGreaterThanTwo = (1>2)
let isOneLessThanTwo = (1<2)
不需要是一个火箭科学家也可以搞明白isOneGreaterThanTwo会等于false,isOneLessThanTwo会等于true。
也有一个操作符允许你测试一个值小于或等于另一个值:<=。这是<和==的组合,因此返回true如果第一个值小于或等于第二个值。
相似的,有一个操作符让你测试一个值是否大于或等于另一个,你应该已经猜到了就是 >=。
布尔逻辑
上面的每个例子只测试了一个情况。当George Boole发明了布尔型的时候,他为它计划了更多而不只是这些简陋的开端。他发明了布尔逻辑,允许你组合多个情况来形成结果。
组合情况的一种方式是使用AND。当你同时AND两个布尔型的时候,结果就是另一个布尔型。如果两个布尔型都是true,结果就是true。否则结果都是false。
Swift里,布尔型的AND操作符是&&,像这样使用:
let and = true && true
这种情况里,and会是true。如果右侧的任何一个是false,结果就会是false。
还有一种方式组合情况是使用OR。当你OR两个布尔型的时候,有一个输入布尔型是true结果就是true。只有输入布尔型都是false,结果才是false。
Swift里,布尔型的OR操作符是||,像这样使用:
let or = true || false
这个例子里,or会是true。如果右侧的两个值都是false,or会是false。如果都是都是true,or还会是true。
Swift里,布尔逻辑通常应用到多种情况里。也许你想判断两个情况是否都是true;这种情况下,你要使用AND。如果你只关心两者是否其一为true,那就用OR咯。
举个例子,看看下面的代码:
let andTue = 1 < 2 && 4 > 3
let andFalse = 1 < 2 && 3 > 4
let orTrue = 1 < 2 || 3 > 4
let orFalse = 1 == 2 || 3 == 4
每个都检查了两个独立的情况,用AND或OR来组合他们。
用布尔逻辑来组合一个或更多的比较是可能的。例如,你可以写这样一个复杂的对比:
let andOr = (1 < 2 && 3 > 4) || 1 < 4
括号消除了表达式的歧义。Swift首先计算括号的子表达式,然后计算完整的表达式,用下面的三步:
- (1 < 2 && 3 > 4) || 1 < 4
- (true && false) || true
- false || true
- true
迷你练习
- 创建一个叫做myAge的常量,设置为你自己的年龄。然后,创建一个叫isTeenager的常量,用布尔逻辑来判断,是否年龄显示为一个青少年人,即13到19岁年龄段的人。
- 创建另一个常量叫做theirAge,设置为我的年龄,23。然后创建一个常量叫做bothTeenagers使用布尔型逻辑来判断你和我是不是都是青少年人。
关键点
-
算术操作符是:
Add(加): + Subtract(减): - Multiple(乘): * Divide(除): / Modulo(模除):%
-
你可以把算术操作符和赋值操作符,=,来组合对变量做算术,然后把结果保存回原变量。
-
做算术然后赋值回原变量的操作符:
加并且赋值:+= 减并且赋值:-+ 乘并且赋值:*= 除并且赋值:/=
-
使用布尔型数据类型,Bool,来表示true和false。
-
比较操作符,所有都返回一个布尔型,是:
等于:== 不等于:!= 小于:< 大于:> 小于等于:<= 大于等于:>=
-
可以使用布尔型逻辑来组合比较情况。
接下来去哪儿?
你会发现数字特别是布尔型逻辑会贯穿这个教程剩下的部分,当你为你的apps写代码的时候。下一篇教程里,你会为你的Swift军火库增加另一个数据类型:字符串,来保存文本。你会发现处理文字和处理数字有很多相似点。只是另一个带有操作符的类型而已!
试试下面的挑战来巩固你的数字类型的知识,然后做好继续学的准备吧!
挑战
A挑战:预言结果
看一下下面的代码:
let a = 46
var b = 10
let anwser = ...
搞明白answer在你替换最后一行为下面的几个选项的时候会等于什么:
//1
let answer = (a * 100) + b
//2
let answer = (a * 100) + (b * 100)
//3
let answer = (a * 100) + (b / 10)
B挑战:布尔逻辑
在接下来的每种情况中,布尔型answer常量的值会是什么?
let answer = true && true
let answer = false || false
let answer = (true && 1 != 2) || (4 > 3 && 100 < 1)
let answer = ((10 / 2) > 3) && ((10 % 2) == 0)
C挑战
创建一个叫coordinates的常量,复制一个包含(2,3)的元组给它。
然后创建另外两个常量,也包含(2,3)的sameCoordinates和otherCoordinates(3,4)。
现在,用==, !=, <和>来比较这三个元组。你会发现什么?
介绍
欢迎来到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之路,做好接触更高级编程主题的准备。
网友评论