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

詳細(xì)講解Swift中的類型占位符

 更新時間:2022年06月17日 16:41:01   作者:Swift社區(qū)  
類型占位符是swift5.6中引?的?個新功能,在處理稍微復(fù)雜的通?類型時,它可能真的很有用,這篇文章主要給大家介紹了關(guān)于Swift類型占位符的相關(guān)資料,需要的朋友可以參考下

Swift 的類型推斷能力從一開始就是語言的核心部分,它極大地減少了我們在聲明有默認(rèn)值的變量和屬性時手動指定類型的工作。例如,表達(dá)式var number = 7不需要包含任何類型注釋,因為編譯器能夠推斷出值7是一個Int,我們的number變量應(yīng)該被相應(yīng)的類型化。

作為 Xcode 13.3 的一部分而一起發(fā)布的 Swift 5.6,通過引入 "類型占位符(type placeholders) "的概念,繼續(xù)擴(kuò)展這些類型推理能力,這在處理集合和其他通用類型時非常有用。

例如,假設(shè)我們想創(chuàng)建一個Combine里面具有默認(rèn)整數(shù)值的 CurrentValueSubject的實例。關(guān)于如何做到這一點的初步想法可能是簡單地將我們的默認(rèn)值傳遞給該主體的初始化器,然后將結(jié)果存儲在本地的一個let聲明的屬性中(就像創(chuàng)建一個普通的Int值時一樣)。然而,這樣做會給我們帶來以下編譯器錯誤:

// Error: "Generic parameter 'Failure' could not be inferred"
// Error: “無法被推斷出泛型的`Failure`參數(shù) ”
let counterSubject = CurrentValueSubject(0)

這是因為CurrentValueSubject是一個泛型類型,實例化時不僅需要Output類型,還需要Failure類型——這是該主體能夠拋出的錯誤類型。

因為我們不希望我們的主體在這種情況下拋出任何錯誤,所以我們會給它一個Failure類型的值Never(這是在 Swift 中使用 Combine 的一個常見慣例)。但為了做到這一點,在 Swift 5.6 之前,我們需要明確地指定我們的Int輸出類型——像這樣:

let counterSubject = CurrentValueSubject<Int, Never>(0)

不過從 Swift 5.6 開始,這種情況就不存在了——因為我們現(xiàn)在可以使用一個類型占位符來表示我們主體的Output類型,這讓我們再次利用編譯器為我們自動推斷出該類型,就像在聲明一個普通的Int值一樣:

let counterSubject = CurrentValueSubject<_, Never>(0)

這很好,但可以說這并不是 swift 里面很大的改進(jìn)。畢竟,我們用_代替Int只是節(jié)省了兩個字符,而且手動指定像Int這樣的簡單類型也不是一開始就有問題的。

**但現(xiàn)在讓我們看看這個功能如何擴(kuò)展到更復(fù)雜的類型,這是它真正開始發(fā)光的地方。**例如,假設(shè)我們的項目包含以下函數(shù),讓我們加載一個用戶注解的PDF文件:

func loadAnnotatedPDF(named: String) -> Resource<PDF<UserAnnotations>> {
    ...
}

上面的函數(shù)使用了一個相當(dāng)復(fù)雜的泛型作為它的返回類型,這可能是因為我們需要在多個地方中重復(fù)使用我們的Resource類型,也因為我們選擇了使用*幻象類型*來指定我們當(dāng)前處理的是哪種PDF。

現(xiàn)在讓我們看看,如果我們在創(chuàng)建主體時調(diào)用上述函數(shù),而不是僅僅使用一個簡單的整數(shù),那么我們之前基于CurrentValueSubject的代碼會是什么樣子:

// Before Swift 5.6:
let pdfSubject = CurrentValueSubject<Resource<PDF<UserAnnotations>>, Never>(
    loadAnnotatedPDF(named: name)
)

// Swift 5.6:
let pdfSubject = CurrentValueSubject<_, Never>(
    loadAnnotatedPDF(named: name)
)

這是一個相當(dāng)大的改進(jìn)啊 基于 Swift 5.6 的版本不僅為我們節(jié)省了一些輸入,而且由于 pdfSubject 的類型現(xiàn)在完全來自 loadAnnotatedPDF 函數(shù),這可能會使該函數(shù)(及其相關(guān)代碼)的迭代更加容易——因為如果我們改變該函數(shù)的返回類型,需要更新的手動類型注釋將減少。

不過,值得指出的是,在上述情況下,還有另一種方法可以利用Swift的類型推理能力——那就是使用類型別名,而不是類型占位符。例如,我們可以在這里定義一個UnfailingValueSubject類型別名,我們可以用它來輕松地創(chuàng)建不會產(chǎn)生任何錯誤的主體:

typealias UnfailingValueSubject<T> = CurrentValueSubject<T, Never>

有了上述內(nèi)容,我們現(xiàn)在就可以在沒有任何泛型注解的情況下創(chuàng)建我們的pdfSubject了——因為編譯器能夠推斷出T指的是什么類型,而且失敗類型Never已經(jīng)被硬編碼到我們的新類型別名中:

let pdfSubject = UnfailingValueSubject(loadAnnotatedPDF(named: name))

但這并不意味著類型別名在通常情況下都比類型占位符好,因為如果我們要為每種特定情況定義新的類型別名,那么這也會使我們的代碼庫變得更加復(fù)雜。有時,在內(nèi)聯(lián)中指定所有的東西(比如使用類型占位符時)絕對是個好辦法,因為這可以讓我們定義完全獨立的表達(dá)式。

在我們總結(jié)之前,讓我們也來看看類型占位符是如何與集合字面量(literals)一起使用的——例如在創(chuàng)建一個字典時。在這里,我們選擇手動指定我們的字典的 Key 類型(為了能夠使用點語法來指代枚舉的各種情況),同時為該字典的值使用一個類型占位符:

enum UserRole {
    case local
    case remote
}

let latestMessages: [UserRole: _] = [
    .local: "",
    .remote: ""
]

這就是類型占位符——Swift 5.6 中引入的一個新功能,在處理稍微復(fù)雜的通用類型時,它可能真的很有用。但值得指出的是,這些占位符只能在調(diào)用站點使用,而不是在指定函數(shù)或計算屬性的返回類型時使用。

總結(jié)

到此這篇關(guān)于Swift類型占位符的文章就介紹到這了,更多相關(guān)Swift類型占位符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • NotificationCenter類實現(xiàn)原理

    NotificationCenter類實現(xiàn)原理

    這篇文章主要為大家介紹了NotificationCenter類實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • RxSwift學(xué)習(xí)之Observable的新建、訂閱及取消訂閱

    RxSwift學(xué)習(xí)之Observable的新建、訂閱及取消訂閱

    這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之Observable的相關(guān)資料,文中詳細(xì)的給大家介紹了關(guān)于新建Observable、訂閱Observable和取消訂閱并消除內(nèi)存泄漏等相關(guān)的內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • Swift 基本數(shù)據(jù)類型詳解總結(jié)

    Swift 基本數(shù)據(jù)類型詳解總結(jié)

    在我們使用任何程序語言編程時,需要使用各種數(shù)據(jù)類型來存儲不同的信息。變量的數(shù)據(jù)類型決定了如何將代表這些值的位存儲到計算機(jī)的內(nèi)存中。在聲明變量時也可指定它的數(shù)據(jù)類型。所有變量都具有數(shù)據(jù)類型,以決定能夠存儲哪種數(shù)據(jù)
    2021-11-11
  • 深入解析Swift編程中的構(gòu)造方法

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

    先進(jìn)的Swfit語言同樣具有構(gòu)造方法,構(gòu)造方法在對象被創(chuàng)建后會首先被調(diào)用,這里我們就來深入解析Swift編程中的構(gòu)造方法:
    2016-07-07
  • 使用?Swift?Package?插件生成代碼的示例詳解

    使用?Swift?Package?插件生成代碼的示例詳解

    這篇文章主要介紹了使用?Swift?Package?插件生成代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Swift教程之繼承詳解

    Swift教程之繼承詳解

    這篇文章主要介紹了Swift教程之繼承詳解,一個類可以從另外一個類中繼承方法,屬性或者其它的一些特性,當(dāng)一個類繼承于另外一個類時,這個繼承的類叫子類,被繼承的類叫父類,需要的朋友可以參考下
    2015-01-01
  • Swift實現(xiàn)無限輪播效果

    Swift實現(xiàn)無限輪播效果

    這篇文章主要為大家詳細(xì)介紹了Swift無限輪播效果實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 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條件語句等控制流語句,需要的朋友可以參考下
    2015-01-01
  • RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例

    RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例

    這篇文章主要介紹了RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12

最新評論

洛阳市| 佛教| 屯昌县| 聊城市| 安康市| 仁怀市| 互助| 黄冈市| 思南县| 凤庆县| 萝北县| 南川市| 平定县| 隆化县| 天等县| 镇原县| 延庆县| 江达县| 沧州市| 思茅市| 子洲县| 江华| 武鸣县| 孟州市| 广灵县| 深州市| 延安市| 崇信县| 乌苏市| 岳池县| 淄博市| 杭州市| 南华县| 阿勒泰市| 屏边| 南澳县| 普洱| 上蔡县| 隆安县| 延边| 邹城市|