Swift4 可选型, 可失败的构造函数
创建: 2018/02/25
完成: 2018/02/26
更新: 补充类内可选型属性不初始化自动设为nil
【任务表】TODO
可选型 | |
可选型与nil |
可选型声明方法 var 属性: 类型? // 类型后面加问号 var 属性: Optional<类型> // 声明方法2: 带参数的类型指定 // 例 var sample: Int? var sample2: Optional<Int> ● 不初始化则自动设为nil 在类内不初始化自动设为nil ● 表达可能不存在/失败等情况,如函数执行失败返回可选型, 没有设定值等 ● 可以减少接入空指针(误把nil当成正常值来用) ● 可以实现初始化可能失败的构造函数 |
展开可选型 |
从可选性中去除正常值(有的话), 叫做unwrap, 展开 强制展开, !: var sample: Int? = Int("abc")// 在实例后面加上! var b = sample! // 错误,强制展开nil会报错 ● !, ?不是运算符,不能重载 |
条件判断与可选型 |
强制展开时遇到nil会报错,所以先判断是不是nil if sample != nil { var b = sample } ● 可选型插值/作为字符串时,会警告。 去除警告用构造函数 String(describing: Subject) 除了debug外不把可选型直接做字符串
|
可选绑定相关语法 | |
目的 |
使用可选值 如果可选值只是判定条件而不需要使用,直接用 != nil 来实现
|
if-let (可选绑定 optional binding) |
if let 属性名 = 可选型属性 { // 也可以用var ... //可选型属性有值时的处理 } else { ... // 可选型属性为nil时的处理 } ● 可选型属性有值是条件为真,代入属性里 ● 可用var, 多个可选型时用逗号,隔开 if let 属性名1 = 可选型属性1, let 属性名2 = 可选型属性2, ... { // 也可以用var ... //可选型属性有值时的处理 } else { ... // 可选型属性为nil时的处理 } ● 属性名可与可选型属性名相同 ● 也可以用在while里
|
可选绑定与条件式 | if-let里除了多个可选绑定外,还可以写普通条件(也是用逗号隔开)
例 if a!= 111, let a = a, a > 100, a < 200 { ... } else { ... }
● 左侧的可选绑定(展开的值)可以在右侧使用,如上例
● 也可以用在while, guard里 ● 相当于&&, 没有相当于||的 ● Swift的条件只能是布尔值,所以不能用&&和||。想用的话条件写成 != nil 类型的 |
guard |
不仅限可选绑定, 脱离预想之外的处理时的用法 guard 条件 else { ... return // 必须有break/return/throw等脱离guard所在范围的代码 } ● 条件可以是可选绑定也可以是其他任何条件 ● 条件里的可选绑定在guard后面也可以继续使用 ● 复杂条件下if-let的if层次会很多, 适当考虑使用guard |
nil聚合运算符 |
有值取值, 没值设定默认值 可选型属性 ?? nil下设定的值 // 例 Int("hello") ?? 0 // 相当于 (Int("hello") != nil) ? Int("hello")! : 0 ● 左侧类型T时,右侧可以使T, T? ● 运算结果的类型是右边的类型 ● 可以连用, 短路评估 let sample = a ?? b ?? c ?? 0 // a非nil就a,否则b, b非nil就b, 否则...
|
可选型与函数 | 函数的参数类型, 返回值类型可以是可选型 |
作为函数的inout参数 |
inout参数的类型也可以是可选型 |
readline函数 |
readline(strippinggNewline: Bool = true) -> String? ● Swift的输入函数 (Swift的输出函数: print) ● 从标准输入读取比特列 ● 字码UTF-8 ● 读一行 ● 返回值类型String?, EOF时返回nil ● strippinggNewline表示是否删除换行, 默认true
|
有值可选型 | |
有值可选型 |
var 变量名: 类型! //例 var sample: Int! = nil ● 不用展开,像普通属性一样用。其他方面和?可选型一样 ● 应只用在只有初始值可以为nil的变量 ● 只是评价值的时候进行特殊处理, 本身并不是真正的可选型 ● 典型例: ViewController的属性(GUI等) |
元素为可选型的数组 |
● 数组的元素可以为可选型 ● 元素不能为有值可选型, 其他collection也是一样
|
有值可选型与函数 |
函数的参数类型,返回值类型可以是有值可选型 ● 主要用于C, Objc的API返回的有值可选型(其实是指针) # TODO: Supply [S14.1 数据交互与指针] |
可能错误的构造函数 | |
可失败的构造函数 |
init? { // 带? if ... { return nil //错误时候必须返回nil } } ● 可失败构造函数和普通构造函数参数不能完全一样(因为返回值是决定好的, 算不上重载) ● init!也存在,主要是Objective-C的API用 |