成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Key Paths 創建自定義查詢函數

開發 后端
作為一個相當嚴格,靜態編譯的語言,Swift 可能不會在語法自定義方面提供許多渠道,但這實際上確正好相反。通過如何在 Swift 中自定義操作符,Swift 中 key paths 的能力,函數/結果構建器 等功能,我們有很多機會為特定用例進行調整 Swift 的語法。

[[411527]]

本文轉載自微信公眾號「Swift社區」,作者Swift社區。轉載本文請聯系Swift社區公眾號。

前言

作為一個相當嚴格,靜態編譯的語言,Swift 可能不會在語法自定義方面提供許多渠道,但這實際上確正好相反。通過如何在 Swift 中自定義操作符,Swift 中 key paths 的能力,函數/結果構建器 等功能,我們有很多機會為特定用例進行調整 Swift 的語法。

當然,無可爭議的是,任何類型的語法定制都應小心謹慎地,因為如果我們不小心,非標準語法也可能很容易成為混亂的源泉。但是,在某些情況下,權衡可能是值得的,并且可以易于讓我們制作類似 DSL 這種可以幫助我們使代碼更清晰的語法。

否定布爾值的 key pahts

讓我們查看一個這樣的案例,說我們正在研究一個應用程序,用于管理,過濾和排序文章,其中包含以下 Article 數據模型:

  1. struct Article { 
  2.     var title: String 
  3.     var body: String 
  4.     var category: Category 
  5.     var isRead: Bool 
  6.     ... 

現在讓我們看一下我們的代碼庫中的一個非常常見的任務是過濾各種集合,每個集合包含上述模型的實例。這樣做的一種方法是利用任何 "Swift key paths 表達式可以自動轉換為函數" 的功能,這讓我們在過濾任何布爾屬性時, 可以使用如下在篩選 isread 時的凝練的語法:

  1. let articles: [Article] = ... 
  2. let readArticles = articles.filter(\.isRead) 

這真的是非常好,但是,只有在我們想要與 true 比較時才能使用以上語法 ——如果我們想創建包含所有未讀文章的類似過濾的數組,那么我們必須使用閉包(或 傳入一個函數[1])代替:

  1. let unreadArticles = articles.filter { !$0.isRead } 

這肯定不是一個大問題,但如果上述操作是我們在代碼上的許多不同地方上演的東西,那么我們可能會開始問自己:“如果我們也可以使用否定的布爾值的 key paths 語法會不會更好?“

這就是語法自定義的概念進來的地方。通過實現以下前綴函數,我們實際上可以創建一個小小的調整,這將讓我們不用擔心 true 或 false 的使用 key paths:

  1. prefix func !<T>(keyPath: KeyPath<T, Bool>) -> (T) -> Bool { 
  2.     return { !$0[keyPath: keyPath] } 

以上基本上就是是重載內置的 ! 前置操作符,讓其可以應用于任何 Bool key paths,以便將其轉換為否定(或翻轉)其值的函數 ——現在我們可以計算我們的 UnreadArticles 數組了:

  1. let unreadArticles = articles.filter(!\.isRead) 

基于 key paths 的比較

現在,進一步采取措施,讓我們也可以使用 key paths 來形成篩選器查詢,該篩選器查詢將給定屬性與任何 Equatable 的值進行比較。例如,如果我們想要根據每篇文章的類別過濾我們的文章類別,那將變得有用。該屬性,類別的類型目前被定義為如下所示的枚舉:

  1. extension Article { 
  2.     enum Category { 
  3.         case fullLength 
  4.         case quickReads 
  5.         case basics 
  6.         ... 
  7.     } 

就像我們之前重載的 ! 操作符一樣,我們也可以用 == 運算符進行同樣的事情,我們將返回一個返回 Bool 的閉包,然后可以直接傳遞給篩選器(如 filter 過濾器):

  1. func ==<T, V: Equatable>(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool { 
  2.     return { $0[keyPath: lhs] == rhs } 

通過以上重載,我們現在可以使用基于 key paths 的比較輕松過濾任何集合,如下所示:

  1. let fullLengthArticles = articles.filter(\.category == .fullLength) 

結語

Swift 讓我們通過幾個輕量級重載輕松創建上述功能的事實是非常棒的或令人難以置信的。我傾向于在中間的某個地方停下,認為我們確實可以讓部分 Swift 的語法調整為適合我們的編寫,但同時,我認為應該始終盯緊我們使 diam 更簡單的目標來調整這些代碼。

參考資料

[1]傳入一個函數: https://www.swiftbysundell.com/articles/first-class-functions-in-swift/

 

責任編輯:武曉燕 來源: Swift社區
相關推薦

2010-10-25 16:05:07

oracle自定義函數

2015-02-12 15:33:43

微信SDK

2019-12-02 21:29:45

Keras神經網絡TensorFlow

2022-08-04 18:30:59

DockerfileDocker 鏡像Linux

2015-02-12 15:38:26

微信SDK

2010-09-14 16:47:23

SQL自定義函數

2024-03-04 11:13:29

Django數據庫Python

2022-05-07 10:22:32

JavaScript自定義前端

2010-09-14 16:59:39

SQL自定義函數

2023-06-28 08:05:46

場景vue3自定義

2013-05-02 14:08:18

2010-10-20 16:07:48

SQL用戶自定義角色

2012-05-10 11:34:04

Windows數據庫

2010-05-11 13:16:21

Unix awk

2018-03-16 08:41:16

Oracle存儲函數

2019-12-25 11:47:27

LinuxFVWM

2009-06-23 11:35:44

JSF的Naviati

2022-01-14 09:17:13

PythonAPISIX插件

2021-06-17 06:52:37

C#自定義異常

2022-09-20 07:01:50

對象初始化代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区无线 | 一区二区av| 能看的av网站 | 91在线视频播放 | 成人国产精品色哟哟 | 中文字幕av中文字幕 | 成人av鲁丝片一区二区小说 | 天天综合久久 | 国产精品电影在线观看 | 在线观看免费av网 | 国产一区二区精品在线观看 | 精品一二三区在线观看 | 农村妇女毛片精品久久久 | 欧美美女爱爱视频 | 国产1区2区在线观看 | 欧美一区二区精品 | 中文字幕免费观看 | 国产精品国产三级国产aⅴ入口 | 福利视频一区二区 | 国产视频中文字幕 | 国产一区二区在线免费观看 | wwwww在线观看 | 精品一区在线 | 国产在线精品一区二区 | 手机av免费在线 | 91最新视频 | www.99热.com| 日韩av一二三区 | 欧美一区二区三区视频在线播放 | 亚洲一区二区av | 国产一区二区三区在线 | 免费黄色片在线观看 | 亚洲高清视频在线 | 精品国产一区久久 | 久久躁日日躁aaaaxxxx | 久久毛片 | 日韩精品免费一区二区在线观看 | 久久精品小短片 | 自拍偷拍第一页 | 久久黄色网 | 日韩亚洲欧美一区 |