swift Swift一起修炼swift

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

2016-07-04  本文已影响1451人  张嘉夫

简介

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

快速链接


现在你知道该如何声明常量和变量了,是时候学习如何用操作(operations)来处理数据了。如果不对数据做点什么那它还有什么用呢?

对数字的加减和其它简单操作对于所有电脑编程都是极为重要的。毕竟就像你在第一篇文章里学的,电脑的所有操作都起源于算术。

在这篇文章里,你会学习到如何用Swift来对数字进行基本的算术操作。也会学习布尔型(Booleans),代表了true和false值,以及怎么用它来比较数据。

算术操作

当你调用一个或多个数据,然后把它转换为另一个数据的时候,这就叫操作

理解操作的最简单方式就是想想算术。加法操作用了两个数字然后把他们转换为两个数字的和。减法操作用了两个数字,转换他们为两个数字的差。

你的app里会遍布简单的算术;从计算一篇帖子的“赞”的个数到计算一个按钮或窗口的正确尺寸和位置,数字事实上无处不在!

在这个部分,你会学习到多种算术操作,他们是Swift考虑到对于数字的应用而提供的。在后面的文章里,你会学习到将不只是数字的操作。

简单操作

Swift里所有操作用一个叫做操作符(operator)的符号来表示操作的类型。事实上,你已经看过一个操作符了:等于号,=,就是赋值操作符(assignment operator),你曾经用来给变量或常量分配值。

想想你小时候在学校里学的四种算术操作:加减乘除。对于这些简单操作,Swift使用下面的操作符:

这些操作符是像这么用的:

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也一样,只是数字向右移。
这两个操作的操作符如下:

这是你看到过的第一个包含不止一个字符的操作符。事实上操作符可以被包含任意数量的字符。
这是使用两种操作符的例子:

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。

迷你练习

比较操作符

直到现在,你只见过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. 算术操作符是:

    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语言小能手。

如果你是赤裸裸的编程新手,这篇教程也是为你准备的!教程里贯穿有简短的锻炼和挑战来给你一些编程练习,同时测试你的知识。

需要准备什么

要看这篇教程,你需要准备如下的东西:

如果你还没有安装Xcode最新版本,在继续看下面的教程前要确定安装。

如何使用这篇教程

每篇教程都会介绍触手可及的话题理论,伴随大量Swift代码来示范在学习的实际的应用程序。

教程里的所有代码都是平台中立的;这意味着不是为iOS、OS X或任何其它平台而特定。代码在playgrounds里运行,你在本篇中已经学习了。

在剩下的教程里,你可以把代码在自己的playground里输入进去。这样你就可以和代码“玩耍”(play around),做一些改变立即就能看见代码运行的结果。

剩下的教程里会贯穿实际小练习,都是简短的练习,关于触手可及的主题。每篇的末尾也有挑战,会有编程问题也会有长一点的代码练习来测试你的知识。做完就能掌握大部分的Swift基础知识。

教程更新

教程会随Swift语言的更新而更新,会发布在我的简书和知乎专栏上,搜索“张嘉夫”即可关注我。

目录

本教程从一些基础工作开始来让你起步:

在脑海中有基础数据类型后,就该用那些数据做一些事情了:

最后一篇会回到数据:

这些基础会让你快速开始Swift之路,做好接触更高级编程主题的准备。

上一篇下一篇

猜你喜欢

热点阅读