在通常情况下请使用Int来标记变量或者常量的整数类型,即使已知的数值并不为负,使用默认的整数类型好处是可以保证常量和变量类型的一致性,并且和推测出得类型进行匹配。
仅在有特殊需求的时候使用其他的数据类型,比如外来源明确大小的数据,或者是因为性能,内存使用或者其他必要的优化。在这些情况下使用明确的大小的类型能够有助于发现意外数值溢出并潜在记录使用的数据特性。
数字的储存范围根据不同的数字类型有所不同。Int8的常量或者变量可以储存-128到127得整数范围,而UInt8常量或者变量可以储存0到255的数字范围,如果储存的数字超过相应数字类型的范围在编译的时候则会报错。
let cannotBeNegative: UInt8 = -1
// UInt8 cannot store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 cannot store a number larger than its maximum value,
// and so this will also report an error
因为不同的数字类型会储存不同范围的数值,你必须根据具体的情况选择数字类型的转换,这种明确的转换方式避免了隐藏转换的错误并且使得代码中类型转换目的明确化。
用当前数值来初始化目标数字类型数字可以将当前数字类型转换到其他类型。在下面的例子中,常量twoThousand 是 UInt16类型,而常量one是UInt8数字类型,它们不能直接相加,因为它们不是同一类型。我们通过UInt16(one)创建一个新的UInt16,并且用one得值来初始化,这样我们就可以用这个值来替换原来的了:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
因为现在两边的数字类型都是UInt16了,现在加法就允许了,输出的结果常量twoThousandAndOne被推测为UInt16类型,因为它使两个UInt16相加的结果。
类型(初始值) 是调用Swift类型构造函数并传入相应值的默认方法。事实上,UInt16拥有一个可以接受UInt8值的构造函数,因此该构造函数用于从现有的UInt8来创建一个新的UInt16. 你不能再这里传递任意类型,这必须是UInt16构造函数所支持的。
整数和浮点数间的转换必须是明确的:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double
这里常量three用于创建一个新的Double,这样等式两边数字类型相同,否则是不能相加的。
反之亦然,整数类型也可用Double或者Float来初始化:
浮点数会在转化为整数的过程中丢失小数部分,也就是说4.75会变成4,-3.9 会变成-3.
注意:对数值类型的变量或者常量组合不同于数字简单的组合,数字3可以直接加到0.14159上是因为数字本身不具有明确的数字类型,他们的类型会再编译的时候由编译器推测。
let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int