SwiftUI 中的some關(guān)鍵字

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)該總是這樣做的原因:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容