美文网首页swift Swift一起修炼swift
一个下午让你掌握Swift基础 ( 3/9 ) 数字类型 &am

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

作者: 张嘉夫 | 来源:发表于2016-07-04 23:19 被阅读1451次

    简介

    这是一个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之路,做好接触更高级编程主题的准备。

    相关文章

      网友评论

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

      本文链接:https://www.haomeiwen.com/subject/eskhjttx.html