溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Swift中Opaque?Types怎么使用

發(fā)布時(shí)間:2023-04-07 11:38:45 來源:億速云 閱讀:85 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Swift中Opaque Types怎么使用的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    什么是Opaque Types

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

    如何使用

    假設(shè)我們有一個(gè)定義動物行為的 Protocol Behavior,有兩個(gè)動物類 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)這個(gè)不是什么新奇的特性啊,這不就相當(dāng)于泛型嘛?有這種想法的讀者稍安勿躁,下面就來講一下為什么要使用 Opaque Types。

    為什么要使用

    可讀性更強(qiáng)

    首先,下面的三個(gè)函數(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()
    }

    為什么使用的第一個(gè)原因就是:使用 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

    性能更好

    還有一個(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 { // 正常編譯不會報(bào)錯(cuò)
        if isCat {
            return Cat()
        } else {
            return Dog()
        }
    }

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

    Swift中Opaque?Types怎么使用

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

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

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

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

    使用的限制

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

    • 不用用于匿名函數(shù)的聲明

    以上就是“Swift中Opaque Types怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI