一个下午让你掌握Swift基础 ( 3/9 ) 数字类型 & 操作

简介

这是一个Swift语言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,会为你介绍Swift编程非常基础的内容。从电脑如何工作的全程基本原理到语言结构,你会足够了解这门语言,来处理数据和管理代码的行为。

快速链接


现在你知道该如何声明常量和变量了,是时候学习如何用操作(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使用布尔型逻辑来判断你和我是不是都是青少年人。

关键点

  1. 算术操作符是:

    Add(加): + Subtract(减): - Multiple(乘): * Divide(除): / Modulo(模除):%

  2. 你可以把算术操作符和赋值操作符,=,来组合对变量做算术,然后把结果保存回原变量。

  3. 做算术然后赋值回原变量的操作符:
    加并且赋值:+= 减并且赋值:-+ 乘并且赋值:*= 除并且赋值:/=

  4. 使用布尔型数据类型,Bool,来表示true和false。

  5. 比较操作符,所有都返回一个布尔型,是:
    等于:== 不等于:!= 小于:< 大于:> 小于等于:<= 大于等于:>=

  6. 可以使用布尔型逻辑来组合比较情况。

接下来去哪儿?

你会发现数字特别是布尔型逻辑会贯穿这个教程剩下的部分,当你为你的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之路,做好接触更高级编程主题的准备。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容