一、前言

  • 作为一个相当严格,静态编译的语言,Swift 可能不会在语法自定义方面提供许多渠道,但这实际上确正好相反。通过如何在 Swift 中自定义操作符,Swift 中 KeyPaths 的能力,函数/结果构建器等功能,我们有很多机会为特定用例进行调整 Swift 的语法。
  • 当然,无可争议的是,任何类型的语法定制都应小心谨慎地,因为如果不小心,非标准语法也可能很容易成为混乱的源泉。但是,在某些情况下,权衡可能是值得的,并且可以易于制作类似 DSL 这种可以帮助我们使代码更清晰的语法。

二、否定布尔值的 KeyPaths

  • 查看一个如下所示的案例,说正在研究一个应用程序,用于管理,过滤和排序文章,其中包含以下 Article 数据模型:
struct Article {var title: Stringvar body: Stringvar category: Categoryvar isRead: Bool...
}
  • 现在来看一下代码库中的一个非常常见的任务是过滤各种集合,每个集合包含上述模型的实例。这样做的一种方法是利用任何 “Swift key paths 表达式可以自动转换为函数” 的功能,这让我们在过滤任何布尔属性时, 可以使用如下在筛选 isread 时的凝练的语法:
let articles: [Article] = ...
let readArticles = articles.filter(\.isRead)
  • 这真的是非常好,但是只有想要与 true 比较时才能使用以上语法,如果想创建包含所有未读文章的类似过滤的数组,那么必须使用闭包(或传入一个函数 [1])代替:
let unreadArticles = articles.filter { !$0.isRead }
  • 这肯定不是一个大问题,但如果上述操作是我们在代码上的许多不同地方上演的东西,那么我们可能会开始问自己:“如果我们也可以使用否定的布尔值的 key paths 语法会不会更好?“
  • 这就是语法自定义的概念进来的地方,通过实现以下前缀函数,实际上可以创建一个小小的调整,这将让我们不用担心 true 或 false 的使用 key paths:
prefix func !<T>(keyPath: KeyPath<T, Bool>) -> (T) -> Bool {return { !$0[keyPath: keyPath] }
}
  • 以上基本上就是是重载内置的 !前置操作符,让其可以应用于任何 Bool key paths,以便将其转换为否定(或翻转)其值的函数,现在可以计算 UnreadArticles 数组:
let unreadArticles = articles.filter(!\.isRead)

三、基于 KeyPaths 的比较

  • 现在,进一步采取措施,也可以使用 key paths 来形成筛选器查询,该筛选器查询将给定属性与任何 Equatable 的值进行比较。例如,如果想要根据每篇文章的类别过滤我们的文章类别,那将变得有用。该属性,类别的类型目前被定义为如下所示的枚举:
extension Article {enum Category {case fullLengthcase quickReadscase basics...}
}
  • 就像之前重载的 ! 操作符一样,我们也可以用 == 运算符进行同样的事情,将返回一个返回 Bool 的闭包,然后可以直接传递给筛选器(如 filter 过滤器):
func ==<T, V: Equatable>(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool {return { $0[keyPath: lhs] == rhs }
}
  • 通过以上重载,现在可以使用基于 key paths 的比较轻松过滤任何集合,如下所示:
let fullLengthArticles = articles.filter(\.category == .fullLength)

四、结语

  • Swift 让我们通过几个轻量级重载轻松创建上述功能的事实是非常棒的或令人难以置信的,我倾向于在中间的某个地方停下,认为我们确实可以让部分 Swift 的语法调整为适合我们的编写,但同时,我认为应该始终盯紧我们使 diam 更简单的目标来调整这些代码。

Swift之使用KeyPaths创建自定义查询函数相关推荐

  1. Swift之使用key paths创建自定义查询函数 | CSDN创作打卡

    一.前言 作为一个相当严格,静态编译的语言,Swift 可能不会在语法自定义方面提供许多渠道,但这实际上确正好相反.通过如何在 Swift 中自定义操作符,Swift 中 key paths 的能力, ...

  2. mysql 自定义查询函数,mysql自定义函数与动态查询

    摘要 腾兴网为您分享:mysql自定义函数与动态查询,智学网,夜读小说,小睡眠,西餐菜谱等软件知识,以及猫语翻译器,江西校讯通,刷qq业务的网站,房洽洽,学士服照,爱站seo工具包,虚拟声卡驱动,隐藏 ...

  3. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  4. Oracle自定义聚集函数

    节选自<剑破冰山--oracle开发艺术>一书,书籍销售地址: http://product.china-pub.com/197199 http://product.dangdang.co ...

  5. 使用ActiveX实现的Web自定义查询-万能查询

    -----前言------     从事C/S.WEB开发已有多年,一直比较关注"自定义查询"."万能查询"这些概念.在项目开发中,用户会经常要求对查询统计报表 ...

  6. oracle怎么自定义排序,查询时怎么根据一个自定义的函数来进行排序

    查询时如何根据一个自定义的函数来进行排序 如何写一个函数将IP地址转化为十进制数字的函数IPTONuM然后当查询iptable的时候根据IPTONuM得到的结果进行排序 [iptable表不仅有IP地 ...

  7. Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现)

    Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现) 目录 matplotlib库中利用legend函数创建自定义图例 原始图像 在原始图像上创建自定义 ...

  8. 自定义条件查询_数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效...

    Excel数据查询,相信大家首先会想到vlookup函数.毋庸置疑vlookup函数在Excel数据查询中作用是非常的强大.但是它也有一些不能实现的数据查询. 如上图所示,我们需要根据人员的出现次数, ...

  9. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...

    如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...

最新文章

  1. 只要努力搞,没有KPI搞不垮的团队?
  2. [原]为虚拟机添加新的磁盘分区
  3. python3 module 'pexpect' has no attribute 'spawn' 解决方法
  4. 近期有哪些值得读的推荐系统论文?来看看这份私人阅读清单
  5. mysql 随机update_MySQL随机查询数据与随机更新数据
  6. oppo 手机侧滑快捷菜单_OPPO刚秀出卷轴屏手机,就被打了一记响亮的“耳光”
  7. 【demo练习二】:WPF依赖属性的练习
  8. MySQL(14)--- WHERE 子句
  9. 小程序入门学习09--云开发02
  10. C1083: 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
  11. PHP网页监控系统,实现网页变化监控
  12. 在云测平台对手机进行兼容性测试
  13. linux中磁盘阵列说明,常用磁盘阵列说明
  14. c语言且或者是优先级,C语言笔试题
  15. [计算机基础]浮点数在计算机中的表示
  16. HTML期末作业-电影主题网站介绍
  17. 计算机ppt测试题填空题,2017职称计算机PowerPoint练习试题及答案(1)-中华考试网...
  18. Unity AR小游戏(玩具小车)踩坑记
  19. 一个简单好用的磨皮祛斑算法理论和python实现
  20. 读书笔记:《敏捷软件测试》

热门文章

  1. 系统学习Python——单元测试unittest:测试报告
  2. Android漂亮的音乐歌词控件,仿网易云音乐滑动效果
  3. 用vue PHP实现海报设计功能,有关vue html2canvas生成海报功能的实现
  4. oms中显示服务器错误,服务器登陆异常
  5. xcode 可以打开xmind_思维导图格式转换:Xmind → FreeMind
  6. 音乐播放器应用代码实现
  7. MySQL 提示 truncated incorrect Double value解决办法
  8. 电子签名软件有哪些?10大电子签名平台盘点
  9. 宇枫资本家庭妇女如何理财
  10. htmlunit webrequest ajax,HtmlUnit ajax执行问题解决