最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift?中?Opaque?Types學(xué)習(xí)指南

 更新時(shí)間:2023年04月07日 10:57:37   作者:馮志浩  
這篇文章主要為大家介紹了Swift?中?Opaque?Types學(xué)習(xí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是Opaque Types

Opaque Types 是在 Swift5.7 新添加的一個特性。主要是和 Protocol 來搭配使用,用來定義函數(shù)中的參數(shù)類型。它的作用就是隱藏參數(shù)的具體類型,從而使代碼變得更加通用,減少冗余代碼。廢話不多說,下面來看一看它如何使用。

如何使用

假設(shè)我們有一個定義動物行為的 Protocol Behavior,有兩個動物類 Cat 和 Dog 遵守了該協(xié)議:

protocol Behavior {
    func run()
}
struct Cat: Behavior {
    func run() {
        print("Cat run")
    }
}
struct Dog: Behavior {
    func run() {
        print("Dog run")
    }
}

如果我們想測試一下 run 的功能,可以通過使用 Opaque Types 來定義函數(shù)的參數(shù),從而使測試函數(shù)可以接受 Cat 和 Dog 的實(shí)例對象:

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 關(guān)鍵字聲明的類型就是所謂的 Opaque Types,some Behavior 的意思就是任何遵守了 Behavior 的類的實(shí)例對象。

看到這里,可能有的讀者就會發(fā)現(xiàn)這個不是什么新奇的特性啊,這不就相當(dāng)于泛型嘛?有這種想法的讀者稍安勿躁,下面就來講一下為什么要使用 Opaque Types。

為什么要使用

可讀性更強(qiáng)

首先,下面的三個函數(shù)從語法層級上來說都是等價(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()
}

為什么使用的第一個原因就是:使用 some 定義更加清晰,使得代碼可讀性更高更容易理解。 上面的代碼定義比較簡單,可能感覺差別不大,大家看看下面的代碼應(yīng)該會有更深的體會??:

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

性能更好

還有一個重要的原因就是當(dāng) Opaque Types 當(dāng)做返回值類型時(shí)它的限制比 Protocol 類型更加嚴(yán)格,比如下面的代碼:

func testReturn(isCat: Bool) -> some Behavior { // 編譯報(bào)錯
    if isCat {
        return Cat()
    } else {
        return Dog()
    }
}
func testReturn1(isCat: Bool) -> Behavior { // 正常編譯不會報(bào)錯
    if isCat {
        return Cat()
    } else {
        return Dog()
    }
}

當(dāng)編譯器編譯 testReturn 函數(shù)時(shí),會報(bào)以下錯誤:

而 testReturn1 則不會報(bào)錯。因?yàn)閷τ?Protocol 當(dāng)做返回值來講,不會強(qiáng)制要求所有分支返回同一類型的對象。

當(dāng) Opaque Types 做返回值時(shí),雖然返回值的具體類型不做限制,即任何遵守 Behavior 協(xié)議的對象都可以,但所有的分支返回必須為同一類型的對象,即可能返回 Cat,又可能返回 Dog 是不允許的。

這樣做的好處就是代碼的性能更好,因?yàn)槲覀儚牡讓酉拗屏朔祷仡愋捅仨毷峭活愋停跃幾g器處理起來會更快。

任何的事物都有兩面性,Opaque Types 也不例外。最后我們來了解一下它的限制。

使用的限制

  • 不能用于可變參數(shù)的聲明
  • 不用用于匿名函數(shù)的聲明

總結(jié)

本篇文章,首先講解了什么是 Opaque Types,然后又了解了它的使用方式,接著學(xué)習(xí)了它的優(yōu)點(diǎn):可讀性更高;性能更好。最后說明了一下它的限制。 希望大家看完這篇文章,能在項(xiàng)目中多多實(shí)踐。

參考鏈接

更多關(guān)于Swift Opaque Types的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Swift簡單快速的動態(tài)更換app圖標(biāo)AppIcon方法示例

    Swift簡單快速的動態(tài)更換app圖標(biāo)AppIcon方法示例

    這篇文章主要為大家介紹了Swift動態(tài)更換app圖標(biāo)AppIcon的簡單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Swift?Error重構(gòu)優(yōu)化詳解

    Swift?Error重構(gòu)優(yōu)化詳解

    這篇文章主要為大家介紹了Swift?Error的問題解決及重構(gòu)優(yōu)化方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 通過示例分析Swift單例模式

    通過示例分析Swift單例模式

    這篇文章主要介紹了通過示例分析Swift單例模式的三種方法,分別是全局變量,內(nèi)部變量,dispatch_once方式,有需要的小伙伴可以參考下。
    2015-06-06
  • swift where與匹配模式的實(shí)例詳解

    swift where與匹配模式的實(shí)例詳解

    這篇文章主要介紹了swift where與匹配模式的實(shí)例詳解的相關(guān)資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下
    2017-07-07
  • swift中defer的實(shí)際應(yīng)用小結(jié)

    swift中defer的實(shí)際應(yīng)用小結(jié)

    這篇文章主要給大家介紹了關(guān)于swift中defer的實(shí)際應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼

    swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼

    正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。本文重點(diǎn)給大家介紹swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2017-08-08
  • swift實(shí)現(xiàn)自定義圓環(huán)進(jìn)度提示效果

    swift實(shí)現(xiàn)自定義圓環(huán)進(jìn)度提示效果

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)自定義圓環(huán)進(jìn)度提示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • SwiftUI學(xué)習(xí)之state和Binding的區(qū)別淺析

    SwiftUI學(xué)習(xí)之state和Binding的區(qū)別淺析

    這篇文章主要給大家介紹了關(guān)于SwiftUI學(xué)習(xí)之state和Binding區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Swift3.0 GCD定時(shí)器的使用DEMO

    Swift3.0 GCD定時(shí)器的使用DEMO

    這篇文章主要介紹了Swift3.0 GCD定時(shí)器的使用,實(shí)現(xiàn)倒計(jì)時(shí),UIDatePicker的使用, 仿寫一個活動倒計(jì)時(shí)的DEMO,需要的朋友可以參考下
    2017-02-02

最新評論

五常市| 乌鲁木齐市| 龙南县| 巴林右旗| 开江县| 南投县| 通河县| 平邑县| 周口市| 鲁山县| 宁安市| 曲松县| 海淀区| 独山县| 余干县| 河津市| 黄梅县| 松江区| 天门市| 郓城县| 江油市| 虎林市| 廉江市| 海阳市| 自治县| 炎陵县| 南皮县| 蒙城县| 康马县| 宜州市| 白银市| 富阳市| 齐河县| 金华市| 柳州市| 稻城县| 奇台县| 巴彦县| 西乡县| 巴彦淖尔市| 临安市|