Swift 5从零到精通iOS开发训练营
上QQ阅读APP看书,第一时间看更新

2.3 初识基本数据类型

本节主要向读者介绍整型、浮点型、布尔型数据在Swift语言中的应用。

2.3.1 数学进制与计算机存储原理

所谓进制,是数学计算中人为规定的一套进位规则。生活中,人们习惯使用十进制进行数据计算,例如到文具店买3支铅笔,到菜市场买菜花费5元3角,等等。在数学与计算机领域,除了十进制之外,二进制、八进制、十六进制的应用也十分广泛,进制的实质是在数据计算时逢几进一(十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位)。

计算机是由逻辑电路组成的,逻辑电路通常只有两个状态,即开关的接通与断开,正好可以表示两种状态(0和1)。对计算机而言,采用二进制不仅能够简化运算法则,提高运算效率,更具有很高的抗干扰能力和可靠性,因此二进制也被称为“机器的语言”。

Swift语言支持开发者使用多种进制进行数据的定义与计算,默认为十进制,如果有特殊需求,可以通过在数据前面加前缀的方式实现,示例如下:

     var type_10 = 17;     //十进制的17
     var type_2 = 0b10001  //二进制的17
     var type_8 = 0o21     //八进制的17
     var type_16 = 0x11    //十六进制的17

在进一步了解了数据类型的相关知识外,读者首先应该清楚几个概念,计算机内存中最小的数据运算单元是一个二进制位(bit),其只有两种状态:0或者1。字节(B)是最小的数据单元,1字节由8个二进制运算位组成。针对无符号数来说,1字节最大可以表示的数为二进制11111111,即十进制数255。读者如果有一些编程经验,一定会对ASCII码十分熟悉,ASCII码的存储空间即1字节大小,因此其最多可以表示256个字符。在字节之上,还有千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)等,它们之间的换算关系如下:

     1B=8bit
     1KB=2^10B
     1MB=2^10KB
     1GB=2^10MB
     1TB=2^10GB
     1PB=2^10TB

2.3.2 整型数据

Swift语言中的整型数据分为有符号整型数据与无符号整型数据。所谓有符号与无符号,通俗的理解即为分正负号与不分正负号。

对于无符号整型,Swift中提供了5种类型4种存储空间的数据类型,4种存储空间分别占用内存8位、16位、32位和64位。使用Xcode开发工具创建一个新的Playground,命名为BasicDataType,编写如下演示代码:

     //8位无符号整型数的最大值255
     var a1 = UInt8.max
     //16位无符号整型数的最大值65535
     var a2 = UInt16.max
     //32位无符号整型数的最大值4294967295
     var a3 = UInt32.max
     //64位无符号整型数的最大值18446744073709551615
     var a4 = UInt64.max

上面的代码中创建了4个变量a1、a2、a3、a4。在Swift语言中,整型数据类型实际上是采用结构体的方式实现的,其中max属性可以获取当前类型的最大值。读者可能会有疑问,在实际开发中,到底应该选择哪一种类型来表达无符号整型呢?上面有提到,Swift语言中的无符号整型实际上有5种,还有1种为UInt类型,这种类型编译器会自动适配,在64位的机器上为UInt64,在32位的机器上为UInt32,示例代码如下:

     //获取数据类型所占位数,在64位机器上UInt占8字节64位
     var a5 = MemoryLayout<UInt>.size

MemoryLayout是Swift标准库中定义的一个枚举,顾名思义其实用于获取内存相关信息,MemoryLayout<UInt>则是一种泛型的用法,调用其size属性可以获取某种数据类型所占内存空间的字节数。

有符号整型数据与无符号整型数据十分类似,只是其首位二进制位为符号位,不纳入数值计算,示例代码如下:

与max属性对应,min属性用于获取整型数据的最小值。

提示

如果我们可以明确当前场景不会出现负数,则可以使用UInt类型,更多时候如果我们不能够保证,最好使用Int类型,即我们存储的数据是非负的,对数值统一使用Int类型有助于数据间的传递和转换。

2.3.3 浮点型数据

浮点型数据用来表示一些小数,浮点型数据分为单精度浮点型与双精度浮点型,分别用Float与Double表示,示例代码如下:

Swift语言支持使用科学计数法来表示数字,在十进制中,使用e来表示10的n次方,在十六进制中,使用p来表示2的n次方,示例代码如下:

     var sum = 1.25e3 //1.25*(10^3) = 1250
     var sun2 = 0x1p3 //1*(2^3) = 8

提示

Double类型比Float类型有着更高的精度,除了某些特殊场景外,我们更推荐使用Double类型来定义浮点数。

Swift语言中还有一个十分有意思的特性,无论是整型数据还是浮点型数据,都可以在数字前加任意个0来进行位数填充,也可以在数字中加入下画线进行分隔,进而增加可读性,这些操作并不会影响原始数值,却提高了对开发者编程的友好性,使代码的结构更加清爽,示例如下:

2.3.4 布尔型数据

布尔类型很多时候也叫作逻辑类型,熟悉Objective-C编程语言的读者可能会了解,在Objective-C语言中,Bool类型其实并非严格意义上的逻辑布尔类型,Objective-C中可以使用零与非零来表达逻辑假与逻辑真。而在Swift语言中则不同,Swift语言的Bool类型十分严格,只有true和false两种值,分别表示真和假。同样,在Swift语言的条件语句以及需要进行逻辑判断的语句中,所使用的条件表达式的值也必须为Bool类型。

创建真与假的布尔值,示例代码如下:

     var bool1 = true   //创建布尔真变量
     var bool2 = false  //创建布尔假变量