Swift?中?Opaque?Types學(xué)習(xí)指南
什么是Opaque Types
Opaque Types 是在 Swift5.7 新添加的一個(gè)特性。主要是和 Protocol 來(lái)搭配使用,用來(lái)定義函數(shù)中的參數(shù)類型。它的作用就是隱藏參數(shù)的具體類型,從而使代碼變得更加通用,減少冗余代碼。廢話不多說(shuō),下面來(lái)看一看它如何使用。
如何使用
假設(shè)我們有一個(gè)定義動(dòng)物行為的 Protocol Behavior,有兩個(gè)動(dòng)物類 Cat 和 Dog 遵守了該協(xié)議:
protocol Behavior { func run() } struct Cat: Behavior { func run() { print("Cat run") } } struct Dog: Behavior { func run() { print("Dog run") } }
如果我們想測(cè)試一下 run 的功能,可以通過(guò)使用 Opaque Types 來(lái)定義函數(shù)的參數(shù),從而使測(cè)試函數(shù)可以接受 Cat 和 Dog 的實(shí)例對(duì)象:
func testRun(animal: some Behavior) { animal.run() } let cat = Cat() let dog = Dog() testRun(animal: cat) // Cat run testRun(animal: dog) // Dog run
從上述代碼可以看到,animal 的類型為 some Behavior
。通過(guò) some 關(guān)鍵字聲明的類型就是所謂的 Opaque Types,some Behavior
的意思就是任何遵守了 Behavior 的類的實(shí)例對(duì)象。
看到這里,可能有的讀者就會(huì)發(fā)現(xiàn)這個(gè)不是什么新奇的特性啊,這不就相當(dāng)于泛型嘛?有這種想法的讀者稍安勿躁,下面就來(lái)講一下為什么要使用 Opaque Types。
為什么要使用
可讀性更強(qiáng)
首先,下面的三個(gè)函數(shù)從語(yǔ)法層級(jí)上來(lái)說(shuō)都是等價(jià)的:
func testRun(animal: some Behavior) { animal.run() } func testRun1<A: Behavior>(animal: A) { animal.run() } func testRun2<A>(animal: A) where A: Behavior { animal.run() }
為什么使用的第一個(gè)原因就是:使用 some 定義更加清晰,使得代碼可讀性更高更容易理解。 上面的代碼定義比較簡(jiǎn)單,可能感覺(jué)差別不大,大家看看下面的代碼應(yīng)該會(huì)有更深的體會(huì)??:
func encodeAnyDictionaryOfPairs(_ dict: [some Hashable & Codable: Pair<some Codable, some Codable>]) -> Data func encodeAnyDictionaryOfPairs<_T1: Hashable & Codable, _T2: Codable, _T3: Codable>(_ dict: [_T1: Pair<_T2, _T3>]) -> Data
性能更好
還有一個(gè)重要的原因就是當(dāng) Opaque Types 當(dāng)做返回值類型時(shí)它的限制比 Protocol 類型更加嚴(yán)格,比如下面的代碼:
func testReturn(isCat: Bool) -> some Behavior { // 編譯報(bào)錯(cuò) if isCat { return Cat() } else { return Dog() } } func testReturn1(isCat: Bool) -> Behavior { // 正常編譯不會(huì)報(bào)錯(cuò) if isCat { return Cat() } else { return Dog() } }
當(dāng)編譯器編譯 testReturn 函數(shù)時(shí),會(huì)報(bào)以下錯(cuò)誤:
而 testReturn1 則不會(huì)報(bào)錯(cuò)。因?yàn)閷?duì)于 Protocol 當(dāng)做返回值來(lái)講,不會(huì)強(qiáng)制要求所有分支返回同一類型的對(duì)象。
當(dāng) Opaque Types 做返回值時(shí),雖然返回值的具體類型不做限制,即任何遵守 Behavior 協(xié)議的對(duì)象都可以,但所有的分支返回必須為同一類型的對(duì)象,即可能返回 Cat,又可能返回 Dog 是不允許的。
這樣做的好處就是代碼的性能更好,因?yàn)槲覀儚牡讓酉拗屏朔祷仡愋捅仨毷峭活愋?,所以編譯器處理起來(lái)會(huì)更快。
任何的事物都有兩面性,Opaque Types 也不例外。最后我們來(lái)了解一下它的限制。
使用的限制
- 不能用于可變參數(shù)的聲明
- 不用用于匿名函數(shù)的聲明
總結(jié)
本篇文章,首先講解了什么是 Opaque Types,然后又了解了它的使用方式,接著學(xué)習(xí)了它的優(yōu)點(diǎn):可讀性更高;性能更好。最后說(shuō)明了一下它的限制。 希望大家看完這篇文章,能在項(xiàng)目中多多實(shí)踐。
參考鏈接
更多關(guān)于Swift Opaque Types的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化
這篇文章主要為大家介紹了Swift?SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09如何使用Swift來(lái)實(shí)現(xiàn)一個(gè)命令行工具的方法
這篇文章主要介紹了如何使用Swift來(lái)實(shí)現(xiàn)一個(gè)命令行工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05