前言:
本篇僅為視頻學(xué)習(xí)筆記
隱式解包 (Implicitly Unwrapped Optional)
? 在某些情況下,可選項(xiàng)一旦被設(shè)定值之后镇防,就會(huì)一直擁有值
? 在某些情況下方援,可以去掉檢查黎休,也不必每次訪問(wèn)的時(shí)候都進(jìn)行解包,因?yàn)樗艽_定每次訪問(wèn)的時(shí)候都有值
? 可以在類型后面加個(gè)陶耍!定義一個(gè)隱式解包的可選項(xiàng)
案例-1
先來(lái)看一下以前的代碼奋蔚,如下:
為什么報(bào)錯(cuò)呢?報(bào)錯(cuò)是因?yàn)閚um1是一個(gè)可選類型烈钞,既然是一個(gè)可選類型也是一個(gè)盒子泊碑,盒子里面裝著一個(gè)10。現(xiàn)在要賦值給num2中的Int毯欣,相當(dāng)于要把盒子里面的東西取出來(lái)賦值給num2中的Int馒过,所以你要解包,怎么解包呢酗钞?在可選類型的右邊加一個(gè)腹忽!,代表進(jìn)行強(qiáng)制解包砚作。將里面的10拿出來(lái)窘奏。如下:不報(bào)錯(cuò)
但是,如果如let num1: Int ! = 10葫录,在Int后面加一個(gè)嘆號(hào)??如下
運(yùn)行一下着裹,成功。
相當(dāng)于米同,如果你定義的這個(gè)可選類型的話骇扇,是用感嘆號(hào)摔竿!,如let num1: Int!少孝,那么這種東西叫做隱式解包的可選項(xiàng)继低。
無(wú)論你在Int后面加一個(gè)!或者?都意味著它是一個(gè)可選類型稍走,都是一個(gè)盒子郁季。所以,完全可以如num1!后面加一個(gè)钱磅!強(qiáng)制解包。但是由于似枕,我定義num1的時(shí)候盖淡,如let num1: Int! = 10,Int后面寫的凿歼!褪迟,所以它是可以自動(dòng)解包的。這就是隱式解包法答憔。
案例-2
如上味赃,由于num1是可選類型,我們?nèi)匀豢梢赃M(jìn)行if判斷虐拓,以及可選類型綁定。
案例-3
如上代碼,如果你的可選類型為nil值甘畅,那么你解包的話搂橙,它肯定會(huì)報(bào)錯(cuò)。由于num1是隱式解包的可選項(xiàng)态兴,所以你賦值給Int它會(huì)偷偷的解包
所以狠持,什么時(shí)候適合用這個(gè)是隱式解包的可選項(xiàng)呢?說(shuō)的很清楚瞻润,如果你能確保你的這個(gè)可選項(xiàng)一直有值的話喘垂,就建議大家使用這個(gè)。
用這個(gè)绍撞,也有風(fēng)險(xiǎn)正勒,可能num1 = nil報(bào)錯(cuò),開發(fā)者楚午,盡量少用這種昭齐。
字符串插值
var age: Int? = 10 print("My age is \(age)")
? 可選項(xiàng)在字符串插值或者直接打印時(shí),編譯器會(huì)發(fā)出警告
? 至少有三種方法消除警告
第一種 強(qiáng)制解包
print("My age is \(age!)") // My age is 10
第二種 調(diào)用這個(gè)字符串的初始化方法
print("My age is \(String(describing: age))") // My age is Optional(10)
第三種 使用 ??
print("My age is \(age ?? 0)") // My age is 10