国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊 Swift 中的類型占位符

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

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

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

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

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

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

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

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

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

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

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

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

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

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

現在讓我們看看,如果我們在創建主體時調用上述函數,而不是僅僅使用一個簡單的整數,那么我們之前基于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)
)

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

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

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

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

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

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

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

enum UserRole {
case local
case remote
}
let latestMessages: [UserRole: _] = [
.local: "",
.remote: ""
]

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

責任編輯:姜華 來源: Swift社區
相關推薦

2022-06-13 09:02:06

Swift類型占位符

2022-05-11 09:01:54

Swift類型系統幻象類型

2022-07-04 08:54:39

Swift處理器項目

2021-07-07 11:41:38

Swift key paths

2024-06-20 11:52:44

C#占位符代碼

2023-10-27 13:59:30

Mybatis占位符

2022-04-06 09:10:03

抽象類型普通類型Swift

2021-03-02 21:52:48

Hive數據類型

2014-08-14 10:12:45

SwiftNil Coalesc

2024-03-13 08:37:18

Vue3Suspense異步組件

2022-06-17 06:23:23

Oracle壓縮類型

2009-07-22 07:41:00

Scala函數文本占位符語法

2024-08-12 08:50:17

2021-07-01 11:07:49

Swift 自定義操作符

2022-03-31 09:01:10

Swift類型擦除類型安全性

2025-04-17 01:00:00

DifyRAGFLow

2021-08-31 07:54:24

SQLDblink查詢

2024-04-26 00:00:00

Rust檢查器代碼

2023-11-09 11:56:28

MySQL死鎖

2022-11-04 09:01:33

SwiftPlottable
點贊
收藏

51CTO技術棧公眾號

中文一区二区完整视频在线观看 | 精品一二三四区| 亚洲va欧美va国产综合剧情| 厕沟全景美女厕沟精品| 色综合久久88| 国产人妖一区| 国产精品一区二区免费| 在线观看免费一区| 精品国产欧美日韩一区二区三区| 91成人伦理在线电影| 欧美videos中文字幕| 国语一区二区三区| 日韩在线观看免费全| 国产精品4hu.www| 成人羞羞视频免费| 国产欧美一区二区三区鸳鸯浴| 亚洲一区日韩精品| 精品夜色国产国偷在线| 国产美女av一区二区三区| 在线你懂的视频| 亚洲色图综合久久| 在线亚洲自拍| 青青草国产精品| 美女视频一区在线观看| 黄色免费视频大全| 自拍偷拍亚洲综合| 欧美精品99久久| 亚洲一区自拍偷拍| 你懂的在线播放| 91精品视频网| 芒果视频成人app| 一本色道久久88精品综合| 国产三级视频在线看| 国产精品久久久久久久久快鸭 | 久久精品一区二区三区不卡| 超碰在线网站| 黄色免费视频大全| 欧洲成人午夜免费大片| 亚洲国产美国国产综合一区二区| 激情都市一区二区| 久久99国产精一区二区三区| www视频在线观看| 伊人永久在线| the porn av| 亚洲精品久久久久久一区二区| 2019中文字幕全在线观看| 欧美一级日韩不卡播放免费| 久久久久久电影| 日本欧美一区二区| 精品成人免费一区二区在线播放| 欧美精品二区三区四区免费看视频| 日韩欧美在线视频| 九九热精品视频在线观看| 精品午夜一区二区三区| 午夜a成v人精品| 国产精品高潮久久| 成人一区二区三区四区| 91免费视频网| www.豆豆成人网.com| 蜜臀av色欲a片无码精品一区| 国产麻豆精品久久一二三| 少妇激情av一区二区| 欧美激情视频一区| 成人a'v在线播放| 视频一区二区三区在线观看| 国产亚洲一区二区三区在线观看| 国产三级在线| 日韩有码视频在线| 国产99久久久国产精品| 精品亚洲精品| 久久久久久国产精品免费无遮挡| 99热都是精品| 日日骚av一区| 欧美精品九九99久久| 蜜桃免费网站一区二区三区| 欧美jizz19性欧美| ga∨成人网| y111111国产精品久久婷婷| 欧美精品激情在线| 亚洲欧美日本精品| 亚洲大片在线| 男人艹女人网站| 成人欧美一区二区三区在线观看 | 激情一区二区三区| 粉嫩aⅴ一区二区三区四区| 香港经典三级在线| 久久天天躁狠狠躁夜夜躁| 国产嫩草影院久久久久| 国产亚洲精品美女久久 | 九色porny自拍视频在线播放 | 国产精品av免费| 亚洲国产成人精品久久| 国产精品毛片在线| 日本不卡网站| 免费 成 人 黄 色| 视频在线99| 欧美专区一二三| www.欧美黄色| 在线免费视频a| 精品久久久影院| 欧美色图在线播放| 欧美成人久久| 成人午夜av电影| 自拍偷拍亚洲综合| 91精品国产色综合久久不卡电影| 精品人在线二区三区| 亚洲国产精品大全| 91国内在线视频| 日韩av一区二区三区美女毛片| 亚洲二区自拍| 日韩精品一区二区三区四| 欧美日韩精品久久久免费观看| 国产精品18毛片一区二区| 国产九色精品| 91久久久久久久一区二区| 国产日产久久高清欧美一区| 国产精品揄拍500视频| 国产在线高清精品| 成人黄色av免费在线观看| 懂色中文一区二区三区在线视频 | 亚洲福利影院| 最新版sss视频在线| www成人免费视频| 宅男午夜在线| 日韩中文在线播放| www.久久ai| 香蕉视频在线免费看| 国产一级二级在线| 国内自拍中文字幕| 欧美日韩成人一区二区三区| 欧美日韩dvd在线观看| 中日韩av电影| 91在线精品一区二区三区| 国产91高潮流白浆在线麻豆| 精品国产鲁一鲁一区二区张丽| 亚洲人成自拍网站| 国产欧美一区二区三区另类精品 | 97在线看福利| 国产高清在线一区二区| 爱情岛论坛成人| 是的av在线| 日本在线观看不卡视频| 精品久久久久久久久久久久| 国产精品va在线| 亚洲爆乳无码精品aaa片蜜桃| 五月天亚洲视频| 国产ktv在线视频| 日韩一区欧美| 久久99国产乱子伦精品免费| 亚洲女与黑人做爰| 亚洲国产精品小视频| 国产日韩av在线| 亚洲欧美日韩精品综合在线观看| 头脑特工队2在线播放| 91精品美女| 图片小说视频色综合| 国产乱子轮精品视频| 欧美午夜丰满在线18影院| 久久成人羞羞网站| 禁断一区二区三区在线| jizzjizz中国精品麻豆| 日本免费视频www| 经典三级在线视频| 国产精品一区二区久久久| 国产一区二区三区丝袜 | 97精品视频在线播放| 91精品国产全国免费观看| 国产精品国产a级| 蜜臀av性久久久久蜜臀av麻豆| 天天躁日日躁狠狠躁欧美巨大小说| 污视频免费在线观看| 日本a级片免费| 日本黄色播放器| 亚洲综合av影视| 欧美精品九九久久| 精品视频久久久久久| 色88888久久久久久影院野外| 久久精品这里都是精品| 日韩不卡一二三区| 在线电影一区二区| 粉嫩一区二区三区四区公司1| 9999在线视频| av福利精品| 绯色av一区| 欧美一级裸体视频| 一二三四中文字幕| 欧美精品欧美精品系列c| 国产精品吴梦梦| 午夜免费在线观看精品视频| 中文字幕一区电影| 亚洲第一区在线| 91精品国产色综合久久不卡电影| 天天av天天翘天天综合网| 国产精品欧美一级免费| av在线一区二区| 国产成人精品www牛牛影视| 日本亚洲视频在线| 久久免费国产| 久久最新视频| 免费亚洲一区|