1.概念

可选项,也叫可选类型,允许将值设置为nil

2.用法

在类型名称后面加个问号 ?来定义可选项。ex:

var name: String? = "xxxx"
name = nil

var age: Int? //初始值是 nil
var age: Int? = nil //这两种完全等价

3.可选值绑定

用枚举的模式匹配处理可选类型是有些复杂,可选类型作为Swift的一大亮点,系统当然提供了更加便利的方案:

if - let

if - let 语句会检查可选值是否为 nil,如果不是 nil,便会解包可选值。并且它可以是多个表达式的组合,可选值的解包结果可以作为后续表达式的值,解包后的作用域介于{}之中。ex:

if let num = num1 , num > 0{
    // do num operator ...
}

while - let
while let 语句和 if let 非常相似,同样 let可以是var,可以是多个表达式的组合,唯一不同的是它表示当表达式的结果返回 nil 时便终止循环

//readLine()从“readLine 函数从标准输入中读取内容,并返回一个可选字符串。当到达输入末尾
//时,这个函数将返回 nil” 
while let n = readLine(){
    print(n)  
}

guard - let
guard let 更像是 if not let 的反义,可选解包不为nil的作用域从当前guard语句开始一直到离开作用域前。在 guard 的 else 代码块中,你可以执行任意代码,但是必须提供一个离开当前作用域的方式,例如:return,异常抛出fatalError()。ex:

func doSomething(_ value:Int?){
    guard let v = value else{
        return
    }
    
    //v的作用域一直到函数结束
    print(v)
    //...
}

4.强制解包

1.可选项是对其他类型的一层包装,可以将它理解为一个盒子
2.如果为nil,那么它是空盒子
3.如果不为nil,那么它里面装的是“被包装类型的数据”
4.如果要从可选项中去出 被包装的数据(将盒子里包装的东西取出来),需要使用感叹号!进行强制解包
5.如果对值为nil的可选项(空盒子)进行强制解包,将会产生运行时错误(Fatal error: Unexpectedly found nil while unwrapping an Optional value)

ex:

var age: Int? = 10
let ageInt: Int = age!
ageInt += 10


5.隐式解包

隐式解包,是在声明类型的时候,加上!。注意区别强制解包

这种方式声明的变量,在使用的时候系统会强制解包,因此看上去不像是一个可选类型。但是一旦值为nil,使用时候依然会异常(使用的时候系统会强制解包)。ex:

let number3:Int! = Int("123") // Int!仍然是可选类型
number3 + 1 // 124 系统强制解包number3,如果number3为nil,闪退。否则正常运行

隐式解包,仍然是可选类型,可以对它进行可选解包

if let number4 = number3{
    number4 // int
}