在编程语言中,不同的数据信息需要不同的数据类型来存储,计算机内存中针对不同的数据类型它们所分配的内存大小是不同的,特定的值需要特定的类型来声明。

 Swift 数据类型

  内置数据类型

  整数 - Int & UInt

  根据一个整数变量占据的内存空间(8/16/32/64-bit,现在 iOS 开发基本全部是 64 位)以及整数是否带有符号(Unsinged),Swift 一共定义了 8 种不同的整数类型:

  Int8/Int16/Int32/Int64

  UInt8/UInt16/UInt32/UInt64

  第一行表示有符号整数,第二行表示无符号整数。

  一般不会在代码中直接使用这些具体的整数类型,只使用 Int 来定义有符号整数,使用 UInt 来定义无符号整数。Swift 编译器会根据当前的目标编译平台,把 Int 或者 UInt 转换成相应的整数类型。

  例如在 32 位平台上,Int 和 Int32 表示的整数长度相等。

  在 64 位平台上,分别使用 mix 和 max 方法,看看 Int 和 Int64 所表达的值分别是多:

1 print("Int.min = \(Int.min)")
 2 print("Int.max = \(Int.max)")
 3 print("Int64.min = \(Int64.min)")
 4 print("Int64.max = \(Int64.max)")
 5 
 6 打印结果:
 7 Int.min = -9223372036854775808
 8 Int.max = 9223372036854775807
 9 Int64.min = -9223372036854775808
10 Int64.max = 9223372036854775807

  Int 和 Int64 表达的范围是一样的。

  同时在 Swift 里面,可以用不同的进制来表达一个整数:

1 let fifteenInDecimal = 15 // 10 进制
2 let fifteenInHex = 0xF // 16 进制
3 let fifteenInOctal = 0o17 // 8 进制
4 let fifteenInBinary = 0b1111 // 2 进制

  以及在数字中使用下划线:

1 let million = 1_000_000

  提示: 除非所在的硬件平台有特别明确的要求要使用 UInt 来定义无符号整数,那么应该尽可能的使用 Int 来表达所有的整数类型,哪怕可以确定一个整数一定是非负数,这会减少很多不必要的类型转换的麻烦。

 浮点数 - Float & Double

  在 Swift 里面,根据表达的精度不同,有两种不同的浮点数类型:

  Float: 最多表达 6 位精度的浮点数。

  Double: 至少可以表达 15 位精度的浮点数。

1 var oneThirdInFloat: Float = 1/3
2 var oneThirdInDouble: Double = 1/3
3 
4 print("\(oneThirdInFloat)")
5 print("\(oneThirdInDouble)")
6 
7 打印:
8 0.333333
9 0.333333333333333

  还可以使用科学计数法表示浮点数:

1 var PI = 0.314e1
2 PI = 314e-2

  提示: 如果没有明确的需求,应该统一使用 Double 来定义浮点数。

 和数字有关的 Type Inference

  在 Swift 里,当给变量不指定类型的时候,编译器会把整数的类型推倒为 Int,会把浮点数的类型推倒为 Double:

1 var three = 3
2 print(" 3 的类型是: \(type(of: three))")
3 
4 var zeroPointForteen = 0.4
5 print(" 0.4 的类型是: \(type(of: zeroPointForteen))")
6 
7 打印:
8  3 的类型是: Int
9  0.4 的类型是: Double

  在 Swift 里面可以把不同类型的数字的字面值直接进行运算:

1 var PI = 3 + 0.14
2 print(" PI 的值: \(PI), PI 的类型是:\(type(of: PI))")
3 
4 打印:
5  PI 的值: 3.14, PI 的类型是:Double

  但是不能把不同数字类型的变量直接进行算数运算,当对变量进行算数运算的时候,所有变量的类型必须是相同的,如果变量类型不同,必须明确将其中一些变量进行类型转换:

1 var sum = Double(three) + zeroPointForteen

  从上面可以看出,使用 Double(three) 把一个 Int 类型的 three "转换"成了浮点数,在这里,之所以对转换加引号,是因为并没有真的把 three 类型从 Int 转换成 Double,而是用 three 的值,初始化了一个新的值为 3 的 Double,并用这个新的 Double 和 zeroPointForteen 相加而已。

参考链接:https://www.boxueio.com/series/swift-up-and-running/ebook/2