Swift基础学习(二)数据类型
在编程语言中,不同的数据信息需要不同的数据类型来存储,计算机内存中针对不同的数据类型它们所分配的内存大小是不同的,特定的值需要特定的类型来声明。
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