通常来讲,即使代码中的整数常量和变量已知非负,也请使用Int类型。总是使用默认的整数类型可以保证你的整数常量和变量可以被复用并且可以匹配整数类字面量的类型推断。
只有在必要的时候才使用其它整数类型,比如要处理外部的长度明确的数据或者为了优化性能、内存占用等等。使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理特殊数据。
整数转换
不同整数类型的变量和常量可以存储不同范围的数字。Int8类型的常量或者变量可以存储的数字范围是-128~127,而UInt8类型的常量或者变量能存储的数字范围是0~255。如果数字超出了常量或者变量可存储的范围,编译的时候会报错。
//UInt8类型不能存储负数,所以会报错
let cannotBeNegative: UInt8 = -1
//Int8类型不能存储超过最大值的数,所以会报错
let tooBig:Int8 = Int8.max+1
要将一种数字类型转换成另一种,你要用当前值来初始化一个期望类型的新数字,这个数字的类型就是你的目标类型。
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
SomeType(ofInitialValue)是调用Swift构造器并传入一个初始值的默认方法。在语言内部,UInt16有一个构造器,可以接受一个UInt8类型的值,所以这个构造器可以用现有的UInt8来创建一个新的UInt16。注意,你并不能传入任意类型的值,只能传入UInt16内部有对应构造器的值。不过你可以扩展现有的类型来让他可以接收其他类型的值(包括自定义类型)。
整数和浮点数转换
整数和浮点数的转换必须显式指定类型。
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three)+ pointOneFourOneFiveNine //pi等于3.14159,所以被推测为Double类型
浮点数到整数的反向转换同样行,整数类型可以用Double或者Float类型来初始化。
//integerPi等于3,所以被推测为Int类型
let integerPi = Int(pi)
当用这种方式来初始化一个新的整数值时,浮点值会被截断。也就是说4.75会变成4,-3.9会变成-3。
注:结合数字常量和变量不同于结合数字类字面量。字面量3可以直接和字面量0.14159相加,因为数字字面量本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。