元组 Tuples
定义:把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
// 模拟一个文具套装,里面有 铅笔:2 橡皮:1 文具盒:15 var bundle: (pencialPrice: Int, eraserPrice: Int, casePrice: Int) = (2, 1, 15 ) var pencialPrice = bundle.pencialPrice var eraserPrice = bundle.eraserPrice var casePrice = bundle.casePrice var bundle2: (Int, Int, Int) = (2, 1, 15 ) var a11 = bundle2.0 var a22 = bundle2.1 var a33 = bundle2.2 // 元组的分解 var (n1, n2, n3) = bundle2 // 如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线 _ 标记 var (m1, _, m3) = bundle2
元组进行比较运算的原则
- 元组中元素的个数必须相同
- 元组中对应位置的元素类型必须相同
- 元组中的元素必须可以比较,Bool 类型的值不能进行比较
首先进行第一个元素的比较,如果比较出结果,则直接返回,不再进行后续比较,如果没有比较出结果,则依次进行后续比较
(1, "zebra") < (2, "apple")
(3, "apple") < (3, "bird")
(1, "zebra") < (2, "apple")
(3, "apple") < (3, "bird")
(4, "dog") == (4, "dog")
可选类型 Optional
- 定义变量时,如果指定是可选的,表示该变量可以有一个指定的类型的值,也可以为 nil;可选值只有两种:如果没有赋值,则为 nil;如果已经赋值,则为原类型的值
- 定义变量时,在类型后面添加一个 ?表示该变量是可选的
- 变量可选项的默认值是 nil
- 常量可选项没有默认值,主要用于在构造函数中给常量设置初始值
//: num 可以是一个整数,也可以是 nil,注意如果为 nil,不能参与计算 let num: Int? = 10 // Optional 可能有两个值(None / Some) // 格式(1.自动推导):var 变量名: Optional = 值 let x: Optional = 20 // 格式(2.使用泛型):var 变量名: Optional<类型> = 值 let y: Optional<Int> = 10 // 格式(3.简化格式):var 变量名: 类型? = 值 let z: Int? = 10 /* * 可选值在参与计算前,必须’解包 unwarping‘ * 只有’解包(unwarp)’后才能参与计算 * 在变量后添加一个 ‘!’,可以强行解包,即:从可选值中强行获取对应的非空值,如果真的为 nil,程序就会崩溃 * 程序员要对每一个 ’!’ 负责 */
- 如果 Optional 值是 nil,不允许参与计算
- 只有解包(unwrap)后台才能参与计算
- 在变量后添加一个 !,可以强行解包
注意:必须要确保解包后的值不是 nil,否则会报错
//: num 可以是一个整数,也可以是 nil,注意如果为 nil,不能参与计算 let num: Int? = 10 //: 如果 num 为 nil,使用 `!` 强行解包会报错 let r1 = num! + 100 //: 使用以下判断,当 num 为 nil 时,if 分支中的代码不会执行 if let n = num { let r = n + 10 }
unexpectedly found nil while unwrapping an Optional value
翻译
在[解包]一个可选值时发现 nil
? 与 !
? 如果出现在类型的后面,它表示将类型包装成 Optional 类型
? 如果出现在实例的后面,它表示的是可选链的调用
! 如果出现在类型的后面,它表示的是隐式解析
! 如果出现要实例的后面,它表示的是将 Optional 的实例进行拆包操作