欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 新添加的一個(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)方法

    這篇文章主要介紹了Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 詳解Swift編程中下標(biāo)的用法

    詳解Swift編程中下標(biāo)的用法

    這篇文章主要介紹了Swift編程中下標(biāo)的用法,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Swift教程之控制流詳解

    Swift教程之控制流詳解

    這篇文章主要介紹了Swift教程之控制流詳解,本文詳細(xì)講解了Swift中的for循環(huán)、for-in循環(huán)、For-Condition-Increment條件循環(huán)、while循環(huán)、Do-while循環(huán)、if條件語(yǔ)句等控制流語(yǔ)句,需要的朋友可以參考下
    2015-01-01
  • Swift中初始化方法的順序介紹

    Swift中初始化方法的順序介紹

    這篇文章主要介紹了Swift中初始化方法的順序介紹,本文介紹的是了類的初始化方法,需要的朋友可以參考下
    2015-01-01
  • Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化

    Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化

    這篇文章主要為大家介紹了Swift?SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 深入解析Swift編程中的構(gòu)造方法

    深入解析Swift編程中的構(gòu)造方法

    先進(jìn)的Swfit語(yǔ)言同樣具有構(gòu)造方法,構(gòu)造方法在對(duì)象被創(chuàng)建后會(huì)首先被調(diào)用,這里我們就來(lái)深入解析Swift編程中的構(gòu)造方法:
    2016-07-07
  • 如何使用Swift來(lái)實(shí)現(xiàn)一個(gè)命令行工具的方法

    如何使用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
  • Swift泛型Generics淺析講解

    Swift泛型Generics淺析講解

    泛型代碼讓你能根據(jù)你所定義的要求,寫出可以用于任何類型的靈活的、可復(fù)用的函數(shù)。泛型是 Swift 最強(qiáng)大的特性之一,很多 Swift 標(biāo)準(zhǔn)庫(kù)是基于泛型代碼構(gòu)建的
    2022-08-08
  • Swift快速集成下拉刷新和上拉加載更多示例代碼

    Swift快速集成下拉刷新和上拉加載更多示例代碼

    這篇文章主要介紹了Swift快速集成下拉刷新和上拉加載更多示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 淺談swift 4.0中private所發(fā)生的變化

    淺談swift 4.0中private所發(fā)生的變化

    Swift 4是蘋果計(jì)劃于2017年秋季推出的最新版本,其主要重點(diǎn)是提供與Swift 3代碼的源兼容性,并努力實(shí)現(xiàn)ABI穩(wěn)定性。下面這篇文章主要給大家介紹了關(guān)于swift 4.0中private所發(fā)生的一些變化,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論