Swift从入门到精通 (移动开发丛书)
上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 //16进制的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种存储空间的数据类型,分别对应占用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属性可以获取某种数据类型所占内存空间的字节数。

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

        var maxInt8 = Int8.max       //127
        var mimInt8 = Int8.min      //-128
        var maxInt16 = Int16.max    //32767
        var minInt16 = Int16.min    //-32768
        var maxInt32 = Int32.max    //2147483647
        var minInt32 = Int32.min    //-2147483648
        var maxInt64 = Int64.max    //9223372036854775807
        var minInt64 = Int64.min    //-9223372036854775808
        var intSize = sizeof(Int)    //8位

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

2.3.3 浮点型数据

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

        var b = MemoryLayout<Float>.size    //4个字节
        var b1 = MemoryLayout<Float32>.size //4个字节
        var b2 = MemoryLayout<Float64>.size //8个字节
        var b3 = MemoryLayout<Float80>.size //16个字节
        var c = MemoryLayout<Double>.size  //8个字节

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

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

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

        var num1 = 001.23         //1.23
        var num2 = 1_000          //1000
        var num3 = 1_000.1_ 001     //1000.1001

2.3.4 布尔型数据

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

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

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