您好,登錄后才能下訂單哦!
今天小編給大家分享一下Swift中Opaque Types怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Opaque Types 是在 Swift5.7 新添加的一個特性。主要是和 Protocol 來搭配使用,用來定義函數中的參數類型。它的作用就是隱藏參數的具體類型,從而使代碼變得更加通用,減少冗余代碼。廢話不多說,下面來看一看它如何使用。
假設我們有一個定義動物行為的 Protocol Behavior,有兩個動物類 Cat 和 Dog 遵守了該協議:
protocol Behavior { func run() } struct Cat: Behavior { func run() { print("Cat run") } } struct Dog: Behavior { func run() { print("Dog run") } }
如果我們想測試一下 run 的功能,可以通過使用 Opaque Types 來定義函數的參數,從而使測試函數可以接受 Cat 和 Dog 的實例對象:
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
。通過 some 關鍵字聲明的類型就是所謂的 Opaque Types,some Behavior
的意思就是任何遵守了 Behavior 的類的實例對象。
看到這里,可能有的讀者就會發現這個不是什么新奇的特性啊,這不就相當于泛型嘛?有這種想法的讀者稍安勿躁,下面就來講一下為什么要使用 Opaque Types。
首先,下面的三個函數從語法層級上來說都是等價的:
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() }
為什么使用的第一個原因就是:使用 some 定義更加清晰,使得代碼可讀性更高更容易理解。 上面的代碼定義比較簡單,可能感覺差別不大,大家看看下面的代碼應該會有更深的體會????:
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
還有一個重要的原因就是當 Opaque Types 當做返回值類型時它的限制比 Protocol 類型更加嚴格,比如下面的代碼:
func testReturn(isCat: Bool) -> some Behavior { // 編譯報錯 if isCat { return Cat() } else { return Dog() } } func testReturn1(isCat: Bool) -> Behavior { // 正常編譯不會報錯 if isCat { return Cat() } else { return Dog() } }
當編譯器編譯 testReturn 函數時,會報以下錯誤:
而 testReturn1 則不會報錯。因為對于 Protocol 當做返回值來講,不會強制要求所有分支返回同一類型的對象。
當 Opaque Types 做返回值時,雖然返回值的具體類型不做限制,即任何遵守 Behavior 協議的對象都可以,但所有的分支返回必須為同一類型的對象,即可能返回 Cat,又可能返回 Dog 是不允許的。
這樣做的好處就是代碼的性能更好,因為我們從底層限制了返回類型必須是同一類型,所以編譯器處理起來會更快。
任何的事物都有兩面性,Opaque Types 也不例外。最后我們來了解一下它的限制。
不能用于可變參數的聲明
不用用于匿名函數的聲明
以上就是“Swift中Opaque Types怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。