本文转载自微信公众号《Swift社区》,作者:Swift社区。转载本文请联系Swift社区公众号。前言作为一种相当严格的静态编译语言,Swift可能不会提供很多语法定制的途径,但实际上恰恰相反。通过如何在Swift中自定义运算符、在Swift中键入路径的能力、函数/结果构建器等,我们有很多机会针对特定用例调整Swift的语法。当然,无可争辩的是,任何一种语法定制都应该小心进行,因为如果我们不小心,非标准语法也很容易成为混淆的根源。然而,在某些情况下,这种权衡可能是值得的,并且可以很容易地让我们制作类似DSL的语法,这将帮助我们使代码更清晰。布尔值的负键路径让我们看一个这样的案例,假设我们正在开发一个应用程序,该应用程序使用以下文章数据模型来管理、过滤和排序文章:structArticle{vartitle:Stringvarbody:Stringvarcategory:CategoryvarisRead:Bool。..}现在让我们看一下代码库中一个非常常见的任务,即过滤各种集合,每个集合都包含上述模型的一个实例。一种方法是利用任何“Swiftkeypathsexpressionscanbeautomaticallyconvertedtofunctions”功能,这允许我们在过滤任何布尔属性时使用以下简洁语法过滤isread:letarticles:[文章]=...letreadArticles=articles.filter(\.isRead)这真的很不错,但是上面的语法只能在我们想要与true进行比较时使用——如果我们想要创建一个包含所有未读文章的列表,如Filtered数组,那么我们必须用一个闭包(或者传入一个函数[1])来代替:letunreadArticles=articles.filter{!$0.isRead}这当然问题不大,但是如果上面的操作是我们代码中玩出来的很多东西不同的地方,那么我们可能会开始问自己:“如果我们也可以使用取反的布尔键路径语法会不会更好?”这就是语法自定义概念的用武之地。通过实现以下前缀函数,我们实际上可以创建一个小调整,让我们不必担心使用键路径为真或假:prefixfunc!
