前言:
本篇僅為視頻學習筆記
多重可選項
例子-1
var num1: Int? = 10 var num2: Int?? = num1 var num3: Int?? = 10
什么叫多重可選項呢,兩個 ??,說到這里,大家有可能想到指針。比如下面:
int *p; // 指針 int **p; // 指向指針的指針
如果三個*大家是不是感覺更復雜了,可選項也是一樣的?可以自己去加,可能是兩個,也可能是三個。
注意,我們這里兩個問號,跟我們之前學的(age ?? 0)是有區別的,這個叫做空合并運算符,左右兩邊是需要放一個值的。而現在,看到的兩個問號是拿來定義這個類型的。
var num1: Int? = 10是一個可選類型,這個盒子里裝著1個10。
那么 var num2: Int?? = num1是一個什么鬼東西呢?這是兩個問號,是包裝了一個可選類型的可選類型嗎?有點繞。
再來看var num1: Int? = 10這個是包裝了一個Int類型的可選類型,那么 var num2: Int?? = num1呢?應該是包裝了一個可選類型的可選類型。現在我們來看是將num1賦值給了它,這個是合情合理的吧。
對比一下,Int?相當于你盒子里包裝了一個Int類型,而Int??相當于你盒子里包裝了一個Int?的可選類型。所以,我們將num1類型傳給了num2。這個是合理的。
我們再來看,var num3: Int?? = 10這個,大家會覺得不合理,你這個里是??不應該傳一個Int?類型給它嗎?這個等下面再說。
我們先看一下它的本質是什么?
可選類型它的本質就是一個盒子,那么它這個盒子裝的是什么呢?像num1這個家伙裝的就是Int類型的10
那么,num2呢?num2也是一個盒子,只不過是你把它想成一個更大的盒子,所以Int??這種類型這個盒子,裝的是Int?這種盒子,而Int?這個家伙呢,也是一個盒子,這個盒子里裝的是Int類型的10。所以num2包裝的是num1,num1內部包裝的是10,所以如下圖:
num3我們看到是直接,將10賦值給了它,那大家想想的是,是不是代表這個大盒子面,直接放著一個10呢?不是的,它是嚴格按照上圖一層一層包裝的規定定義的,雖然我們表面看到的是一個10給num3。但是它實際上,還是跟num2是一樣的。
相當于,這個是還是在最里面,也就是這個大盒子里面,還是有一個小盒子,這個小盒子里面還是放著一個10,也就是說白了,在這種情況下num2和num3是等效的,它們的結構是一樣的。
所以,你要去打印,這兩個是相等的,返回true.
例子-2
var num1: Int? = nil var num2: Int?? = num1 var num3: Int?? = nil
我們來觀察一下num1,它是一個空盒子,如下圖所示:
把num1賦值給num2,也就是num2里面裝的num1這個空盒子,但是這個盒子里面是空的,如下圖:
如果是num3這種呢?其實它是下圖這樣子,相當于整個大盒子都是空的。
所以,你打印num2==num3的話,它返回的是false,它們是不相等的。
所以,使用多重可選項是有陷阱的,要注意一下。