1 什么是some
在今年的WWDC上,蘋果新推出的SwiftUI中出現(xiàn)了新的關(guān)鍵字some

這里的some其實(shí)就是和一個(gè)稱為opaque(不透明)類型有關(guān),在返回類型前面加上一些關(guān)鍵字表示返回類型是不透明的,不透明類型通常被稱為反向泛型類型。
2 什么是泛型和some的作用
當(dāng)你想聲明使用多種類型的函數(shù)時(shí),泛型類型基本上就是一個(gè)占位符,舉個(gè)例子,max函數(shù),取出兩個(gè)數(shù)字的最大值,我們使用到了未知類型T

這里如果要比較大小,必須限定T支持比較操作,所以限定約束條件T:Comparable
在使用的時(shí)候編譯器可以通過函數(shù)參數(shù)來推斷T是什么類型

我們定義一個(gè)SurpriseEgg協(xié)議,具有關(guān)聯(lián)類型ContentType,并且創(chuàng)建改類型的具體類型。
現(xiàn)在假如我們實(shí)現(xiàn)一個(gè)方法去抽取蛋,但是我們不知道具體是那種蛋,因?yàn)樗赡苁荘uzzle、ToyEgg和FigureEgg中任何一種,因?yàn)樗隙ㄊ悄撤N彩蛋(SupriseEgg)

這不會(huì)在?Swift中編譯,因?yàn)閟wift不能把帶有關(guān)聯(lián)類型的協(xié)議類型作為返回類型。
這個(gè)時(shí)候就可以使用some關(guān)鍵字

添加這個(gè)關(guān)鍵字代表,你和編譯器都確定這個(gè)函數(shù)總會(huì)返回一個(gè)特定的具體類型-只是你不知道是哪一種
3 這樣做有什么用處?
使用不透明類型有兩個(gè)很重要作用
1 返回關(guān)聯(lián)類型的協(xié)議類型
現(xiàn)在我們可以從函數(shù)返回一個(gè)protocol,protocol中帶有一個(gè)associated 類型,在以前的版本中,swift不允許我們把具有關(guān)聯(lián)類型的協(xié)議作為返回類型。

這種寫法是可以的,

帶有關(guān)聯(lián)類型的不可以作為返回類型

協(xié)議中使用Self關(guān)鍵字的也是不可以作為返回類型

都需要增加some關(guān)鍵字
2?SwiftUI中的不透明類型
SwiftUI的強(qiáng)大之處在于它的可組合性。通常,您可以使用堆棧視圖和其他容器(如列表)從其他視圖組成布局。這些容器都是通用類型,每次添加,刪除,移動(dòng)或替換視圖時(shí),它們的具體類型都會(huì)更改。例如,讓我們看看以下簡(jiǎn)單的自定義視圖:

這個(gè)類型some View 可以被推斷未?VStack<TupleView<(Text, Image)>>
如果沒有some關(guān)鍵字,我們必須這樣寫

如果我們需要加一個(gè)文本Text,那就需要改寫返回值

這已經(jīng)很煩人了。但最有可能的是,我們將使用多個(gè)容器。我們可能希望將堆棧嵌套在另一個(gè)堆棧中,也可能是列表中的其他堆棧。突然,我們身體的具體類型看起來像這樣
List <Never,TupleView <(HStack <TupleView <(VStack <TupleView <(Text,Text)>>,Text)>>,HStack <TupleView <(VStack <TupleView <(Text,Text)>>,Text)>> )>>
你可能會(huì)同意這沒有任何意義。更改層次結(jié)構(gòu)中的單個(gè)視圖時(shí)更新此類型非常繁瑣。最重要的是,類型根本不可讀。我們的思想無法在合理的時(shí)間內(nèi)處理它,我們關(guān)心的實(shí)際上就是body返回some?View。
這正是Apple為什么在他們的教程中使用不透明視圖類型以及為什么你應(yīng)該總是這樣做的原因:
