工欲善其事,必先利其器,对一门语言基础概念的把握就好像练内功,只有练好了,身体上的某些部位达到一定硬度-。-||……才能跟别人过招,哈哈,来吧,那就让我们硬起来!
数值型字面量
整数字面量可以被写作:
- 一个十进制数,没有前缀
- 一个二进制数,前缀是0b
- 一个八进制数,前缀是0o
- 一个十六进制数,前缀是0x
下面的所有整数字面量的十进制值都是17:
let decimalInteger = 17
let binaryInteger = 0b10001 // 二进制的17
let octalInteger = 0o21 // 八进制的17
let hexadecimalInteger = 0x11 // 十六进制的17```
下面的这些浮点字面量都等于十进制的12.1875:
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0```
就是数值的格式,没必要深究,还是十进制用的多……用到的时候再去看吧
数值型类型转换
通常来讲,即使代码中的整数常量和变量已知非负,也请使用Int类型。总是使用默认的整数类型可以保证你的整数常量和变量可以直接被复用并且可以匹配整数类字面量的类型推断。
只有在必要的时候才使用其他整数类型,比如要处理外部的长度明确的数据或者为了优化性能、内存占用等等。使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理特殊数据。
概括一下:为了世界和平,请用Int……
整数转换
不同整数类型的变量和常量可以存储不同范围的数字。Int8类型的常量或者变量可以存储的数字范围是-128127,而UInt8类型的常量或者变量能存储的数字范围是0255。如果数字超出了常量或者变量可存储的范围,编译的时候会报错:
let cannotBeNegative: UInt8 = -1
// UInt8 类型不能存储负数,所以会报错
let tooBig: Int8 = Int8.max + 1
// Int8 类型不能存储超过最大值的数,所以会报错```
*不同类型的数值也不能直接进行运算,必须显式的装换成同一类型,类似OC的强制转换,写法如下:*
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)```
SomeType(ofInitialValue)是调用 Swift 构造器并传入一个初始值的默认方法。在语言内部,UInt16有一个构造器,可以接受一个UInt8类型的值,所以这个构造器可以用现有的UInt8来创建一个新的UInt16。注意,你并不能传入任意类型的值,只能传入UInt16内部有对应构造器的值。不过你可以扩展现有的类型来让它可以接收其他类型的值(包括自定义类型),请参考扩展。
整数和浮点数转换
还是那句话,不支持隐式转换,需要注意的是,当用 SomeType(ofInitialValue)这种方式来初始化一个新的整数值时,浮点值会被截断。也就是说4.75会变成4,-3.9会变成-3。直接切尾巴……好疼额-。-||
注意:
结合数字类常量和变量不同于结合数字类字面量。字面量3可以直接和字面量0.14159相加,因为数字字面量本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。
这真是极好的……如果我想算1+0.1等于多少,还得写成Double(1)+0.1,那我再也就不想写代码了
类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用typealias关键字来定义类型别名。
为了提升逼格,苹果果断把typedef改了个名……我已经洞悉了苹果工程师六维层面展开后的脑洞,啊哈哈哈……
这么写:
typealias AudioSample = UInt16```
#####布尔值
Swift 有一个基本的布尔(Boolean)类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true和false:
let orangesAreOrange = true
let turnipsAreDelicious = false```
需要注意的是:
如果你在需要使用Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错
什么是非布尔值呢,比如我们之前喜欢用数字是否为零来作为判断条件,这些数字都是非布尔值
比如这样做是不对滴:
let i = 1
if i {
// 这个例子不会通过编译,会报错
}```