SwiftUI 和 Swift 5.1 新特性之:不透明返回類型

今年 WWDC 最重要的關(guān)注點(diǎn)是什么胰锌?Swift恶阴!Swift 5.0 ABI 達(dá)到穩(wěn)定戒突,Swift 5.1 達(dá)到 Module Stability,預(yù)示著 Swift 進(jìn)入了成熟期茅逮。蘋(píng)果也開(kāi)始認(rèn)真地吃自己的狗食了,我們看到這屆大會(huì)上推出了幾個(gè)用 Swift 寫(xiě)的 iOS 框架判哥,占篇幅最大的献雅,無(wú)疑是 SwiftUI。為了這個(gè)框架寫(xiě)得6姨伟,蘋(píng)果可以改語(yǔ)言惩琉,還不止一處。這次給大家介紹的是 Swift 5.1 在 protocol 上的改進(jìn):Opaque Result Type 不透明結(jié)果類型夺荒。這個(gè)特性增強(qiáng)了 Swift 泛型的能力瞒渠,影響了 SwiftUI 的設(shè)計(jì)。

不透明結(jié)果類型新特性

先來(lái)看一段代碼技扼,它展現(xiàn)了原來(lái) protocol 能力上的缺陷:

protocol Shape {}

struct Rectangle: Shape {}

struct Union<A: Shape, B: Shape>: Shape {
    var a: Shape
    var b: Shape
}

struct Transformed<S: Shape>: Shape {
    var shape: S
}

protocol GameObject {
    associatedtype ShapeType: Shape
    var shape: ShapeType { get }
}

struct EightPointedStar: GameObject {
    var shape: Union<Rectangle, Transformed<Rectangle>> {
        return Union(a:Rectangle(), b:Transformed(shape: Rectangle()))
    }
}

缺陷有兩方面:

1.上述代碼是可以編譯通過(guò)的伍玖,但是 EightPointedStar 的 shape 返回類型又臭又長(zhǎng),被暴露了出去剿吻;如果換成 Shape 則編譯不通過(guò)窍箍,原因是 associatedtype ShapeType 要求必須指定具體的類型,而 Shape 不實(shí)現(xiàn) Shape 本身丽旅。

2.假如 Shape 協(xié)議中含有 Self 或者 associatedtype椰棘,無(wú)法作為函數(shù)的返回參數(shù)。這是 Swift 泛型系統(tǒng)長(zhǎng)久以來(lái)的一個(gè)問(wèn)題榄笙。

而本文介紹的 Swift 5.1 Opaque Result Type 特性邪狞,解決了上述問(wèn)題,它為 protocol 作為返回類型提供以下能力:

1.語(yǔ)法上隱藏具體類型茅撞,所以叫做不透明結(jié)果類型

2.強(qiáng)類型:類型參數(shù)不丟失

3.允許帶有 Self 或者 associatedtype 的 protocol 作為返回類型

在 Swift 5.1 中帆卓,將返回類型改成 some + protocol 的形式:

struct EightPointedStar: GameObject {
    var shape: some Shape {
        return Union(a:Rectangle(), b:Transformed(shape: Rectangle()))
    }
}

這類的泛型特性也被稱作“反向泛型”,因?yàn)榫唧w的類型參數(shù)是由“實(shí)現(xiàn)部分”指定并隱藏起來(lái)的米丘,而一般的泛型是由“調(diào)用者”所指定的剑令。

上面這個(gè)例子中:語(yǔ)法上隱藏具體類型很明顯,再舉一個(gè)例子說(shuō)明其它 2 個(gè)特性:

func foo<T: Equatable>(x: T, y: T) -> some Equatable {
   let condition = x == y
    return condition ? 42 : 11
}

let x = foo("apples", "bananas")
let y = foo("apples", "oranges")

print(x == y) // 這里可以被調(diào)用是因?yàn)榉盒拖到y(tǒng)保留了強(qiáng)類型

這個(gè)例子顯示了不透明結(jié)果類型的三個(gè)特性:既對(duì)外隱藏了具體的 Equatable 類型拄查;又保留了強(qiáng)類型(使得 x == y)可以比較吁津;還支持了 Equatable 這個(gè)帶 Self 的泛型約束。

不透明結(jié)果類型對(duì)于函數(shù)實(shí)現(xiàn)有一個(gè)增強(qiáng)的要求:函數(shù)實(shí)現(xiàn)必須返回同一個(gè)具體類型堕扶,以上述代碼為例:不能返回 Equatable 或者是 不同類型的 Equatable 的實(shí)現(xiàn)碍脏。

這里還有一個(gè)小問(wèn)題:既然 x 和 y 可以直接比較癣疟,那么它們可否直接賦值給 var i: Int 呢?答案是對(duì)于靜態(tài)類型系統(tǒng)是不可以的潮酒,它保留了 some Equatable 的具體類型隱藏功能睛挚,但是如果使用動(dòng)態(tài)類型判斷 as? Int,則可以轉(zhuǎn)換成 Int急黎。

SwiftUI 上的應(yīng)用


SwiftUI 的一大特點(diǎn)是高度可組合扎狱,View 的唯一屬性 body 是另一個(gè)滿足 View 約束的具體 View 類型,我們?cè)谶@里看到了組合以及遞歸兩個(gè)特性勃教。下面來(lái)看一個(gè)具體的 View 類型:



這個(gè) OrderCell 使用了不透明返回類型的特性淤击,對(duì)外隱藏了具體類型 HStack。我們看到 OrderCell 的類型它是一個(gè)遞歸的定義故源。



所有的遞歸定義都需要一個(gè)終止條件污抬,于是就有了以下這些 Primitive Views:

結(jié)語(yǔ)

很高興看到蘋(píng)果終于開(kāi)始提供 iOS 操作系統(tǒng)中的 Swift-Only 的 Framework,它對(duì)于 Swift 的推廣和語(yǔ)言改進(jìn)有進(jìn)一步的促進(jìn)作用绳军。

另外印机,我們也要注意到這個(gè)特性增加了 Swift ABI 的能力,需要最新的 runtime 才能運(yùn)行门驾。

下一次射赛,我們聊一聊和 SwiftUI 相關(guān)的另一個(gè) Swift 新特性:Property Wrapper Types

轉(zhuǎn)載于作者:面試官小健
鏈接:http://www.reibang.com/p/349fe5b5c71e

小編這呢,給大家推薦一個(gè)優(yōu)秀的iOS交流平臺(tái)奶是,平臺(tái)里的伙伴們都是非常優(yōu)秀的iOS開(kāi)發(fā)人員楣责,我們專注于技術(shù)的分享與技巧的交流,大家可以在平臺(tái)上討論技術(shù)聂沙,交流學(xué)習(xí)秆麸。歡迎大家的加入(想要進(jìn)入的可加小編微信15673450590)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末及汉,一起剝皮案震驚了整個(gè)濱河市沮趣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豁生,老刑警劉巖兔毒,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漫贞,死亡現(xiàn)場(chǎng)離奇詭異甸箱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迅脐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)芍殖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谴蔑,你說(shuō)我怎么就攤上這事豌骏」昝危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窃躲,是天一觀的道長(zhǎng)计贰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蒂窒,這世上最難降的妖魔是什么躁倒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮洒琢,結(jié)果婚禮上秧秉,老公的妹妹穿的比我還像新娘。我一直安慰自己衰抑,他們只是感情好象迎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著呛踊,像睡著了一般砾淌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谭网,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天拇舀,我揣著相機(jī)與錄音,去河邊找鬼蜻底。 笑死骄崩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薄辅。 我是一名探鬼主播要拂,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼站楚!你這毒婦竟也來(lái)了脱惰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窿春,失蹤者是張志新(化名)和其女友劉穎拉一,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旧乞,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔚润,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尺栖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫡纠。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出除盏,到底是詐尸還是另有隱情叉橱,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布者蠕,位于F島的核電站窃祝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踱侣。R本人自食惡果不足惜锌杀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泻仙。 院中可真熱鬧糕再,春花似錦、人聲如沸玉转。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)究抓。三九已至猾担,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刺下,已是汗流浹背绑嘹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橘茉,地道東北人工腋。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畅卓,于是被迫代替她去往敵國(guó)和親擅腰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 136.泛型 泛型代碼讓你可以寫(xiě)出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束翁潘。你可以寫(xiě)出...
    無(wú)灃閱讀 1,476評(píng)論 0 4
  • 作者:劉鐸本文為原創(chuàng)文章趁冈,轉(zhuǎn)載請(qǐng)注明作者及出處 WWDC 2017 帶來(lái)了很多驚喜。Swift 4 也伴隨著 Xc...
    滬江技術(shù)學(xué)院閱讀 31,861評(píng)論 7 127
  • 怎樣才能維護(hù)好自己的健康拜马,首先要掌握相關(guān)的如何維護(hù)健康知識(shí)渗勘。是什么原因?qū)е挛覀兊貌。∫騺?lái)源于哪兒俩莽?如果知道病...
    七色陽(yáng)光l閱讀 2,827評(píng)論 0 0
  • 2018年已經(jīng)過(guò)去了旺坠,今天是2019年第一天,也是新的開(kāi)始豹绪,新的目標(biāo)新的生活价淌,我也不怕什么了,今年我的目標(biāo)是...
    水玉琴閱讀 551評(píng)論 0 5
  • 后來(lái)你消失在我的視線, 忘了你我是如何相識(shí)巷蚪? 忘了你我是如何別離病毡? 我只知道我想念你了。屁柏。啦膜。 不知道你身在何方? ...
    清香百合1124閱讀 358評(píng)論 1 7