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