1、解包!
可选类型在每次访问的时候都会提前并检测它的值是否存在,但有时候根据程序结构就可以推断出可选类型在首次赋值之后必然存在值,这个时候,就不需要每次都检测值是否存在,如果确定一个可选类型的值一定存在,那么我们使用 "!" 进行解包获取它的值,或者使用Optional Binding
let str: String? = "Hello, playground"; print(str!); //确定该变量有值,则直接进行解包即可 // Optional Binding if let tempStr = str { print(tempStr) }
2、隐式解包可选类型
- 直接在类型后面加! 来指定
- 隐式解包的可选类型主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况。这主要用在类的初始化过程中
- 隐式解包的可选类型本质是可选类型,但是可以被当成一般类型来使用,不需要每次验证值是否存在
-
let possibleString: String? = "An optional string." print(possibleString!) let assumedString: String! = "An implicitly unwrapped optional string." print(assumedString)
- 注意:如果一个隐式解包的可选类型不包含一个实际值,那么对它的访问会抛出一个运行时错误。在变量/常量名后面加!的情况也是一样的。
- 你可以把解包可选类型当成正常的可选类型来探测是否有值。
-
if (assumedString != nil) { print(assumedString) }
- 或者通过类型绑定检查
-
if let definiteString = assumedString { print(definiteString) }
注意:如果一个可选类型存在没有值的可能的话,不应该使用解包可选类型。这种情况下,一定要使用正常的可选类型。
同时解包多个可选类型
var username: String? var password: String? switch (username, password){ case let (username?, password?): // 这里的 ? 是Swift2.0之后新增的语法,表示有值 print("都有值") break case let (usermane?, nil): print("请输入密码") break case let (nil, password?): print("请输入账号") break case let (nil, nil): print("请输入账号密码") break default: break }