ResutBuilder 学习笔记二:增加新的输入数据类型

news/2024/7/20 22:12:15 标签: swift, 开发语言, ios, 学习

ResutBuilder 学习笔记二:增加新的输入数据类型

我们在前面的博客中创建了一个非常简单的结果构建器ConcatBuilder,用于连接多个字符串。 ConcatBuilder虽然非常简单,但已经展现出一些令人兴奋的特征,代码简洁,清晰,但是还远远不够。这篇博文讨论如何为ConcatBuilder 增加新的数据类型。

增加整数输入类型

假设我们需要使用ConcatBuilder将一些整数进行连接,并且按下述方式输入整数:

swift">@ConcatBuilder var str:String  { 
            "春眠不觉晓"
            "处处闻啼鸟"
            1
            2
            3
        }

很遗憾,编译器会报错,因为ConcatBuilder现在不理解整数。我们需要在ConcatBuilder中像下面这样实现buildExpression函数。

swift"> static func buildExpression (_ component: Int) -> String {
            return "\(component)" 
        }

实现上述函数后,所有的组件输入首先要通过该函数进行转换,因而原先的字符串组件的输入会出错。修正这个错误很容易,我们只需要像下面这样增加一个新buildExpression 函数即可:

swift">static func buildExpression (_ component: String) -> String {
            return  component 
        }

有了这两个函数,再次运行,这次结果正确。

swift"> @ConcatBuilder var str:String  { 
            "春眠不觉晓"
            "处处闻啼鸟"
            1
            2
            3
        }
       print( str ) 
       //春眠不觉晓处处闻啼鸟123

增加自定义输入类型

从上面我们可以看到,在结果构建器中,增加对整数类型的支持非常容易。类似地,增加对其他Swift数据类型的支持也不难,只需要重载buildExpression函数即可。你也许觉得太容易了,不以为然。实际上,buildExpression函数强大之处是可以非常容易增加自定义的输入数据类型,从而创建特定于场景的简单清晰表达。

比如在字符串拼接时经常会将一组连续的符号*拼接,我们什么都不做,像下面这样就可以:

swift">@ConcatBuilder var str:String  { 
            "*****"
            "春眠不觉晓"
            "处处闻啼鸟"
            "*****"
         } 

但是,对于这个特定的场景,一组连续的*,上述表达比较原始,既不简洁,也容易出错。 如果能够像下面这样,既简洁、清晰,又不容易出错,不是更好吗?

swift">  @ConcatBuilder var str:String  { 
            Star(length:5) 
            "春眠不觉晓"
            "处处闻啼鸟"
            Star(length:5) 
          }

这次,我们要做的就增加新的数据类型Star,然后在ConcatBuilder中增加相应的buildExpression函数,以增加对Star的支持,后者和增加对整数的支持一样的简单。

首先增加数据类型Star,如下

swift">struct Star {
      let length:Int
      func getString()->String
      {
         return      Array(repeating:"*",count:length).joined()
      }
}

其次,在ConcatBuilder中增加如下buildExpression 函数:

swift">  static func buildExpression (_ component: Star) -> String {
            return  component.getString() 
        }
       

看看最后的结果:

swift">  @ConcatBuilder var str:String  { 
            Star(length:5)
            "春眠不觉晓"
            "处处闻啼鸟"
            Star(length:5)
        }
         print( str )
         //*****春眠不觉晓处处闻啼鸟*****

是不是很酷呢?

小结

本文介绍了如何使用buildExpression函数在结果构建器中增加对新的输入数据类型的支持, 特别是对自定义数据类型的支持。后者非常重要,它是实现一个DSL(领域特定语言)的基础。


http://www.niftyadmin.cn/n/5459927.html

相关文章

Oracle利用BBED恢复崩溃实例(ORA-01092,ORA-00704,ORA-01578)

BBED修复数据损坏引起的数据库崩溃(ORA-01092,ORA-00704,ORA-01578)(2021年某苏州国企的案例) 1.Symptom 用户一个边缘系统出现数据文件损坏,且没有备份,数据库无法启动 报错如下,发现是oracle bootstra…

汽车VBF格式文件详解---HEX文件转成VBF文件

OEM会提供VBF转换工具,如果使用UI界面转换的话,只要按照手册将配置信息填入即可。配置的信息就会填入到Header段里面。在加签的时候,也需要手动在命令行通过调用exe文件,并输入相关参数,就可以生成加签后的VBF了。 当…

Vue模板引用(ref),超详细

虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层 DOM 元素。要实现这一点&#xff0c;我们可以使用特殊的 ref attribute&#xff1a; <input ref"input"> ref 是一个特殊的 attr…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node&#xff08;数据节点&#xff09; 1.2.2MHA Manager&#xff08;管理节点&#xff09; 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

.NET6.0智慧医院手术室麻醉管理平台源码

目录 一、手麻系统概述 二、系统开发环境 三、手麻系统功能 手术进程 手术排班 手术记录 术前访视与评估 术中麻醉记录 麻醉总结 术后访视 模版配置 自动评分 文书模板 ​​​​​​​ 一、手麻系统概述 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;…

以我国为目标的网络攻击中发现 DinodasRAT的Linux版本;黑客伪装成印度空军进行钓鱼攻击;劫持GitHub进行软件供应链攻击Top.gg

关键词&#xff1a;Linux&#xff1b;TinyTurla-NG&#xff1b;Github&#xff1b;Checkmarx&#xff1b;软件供应链攻击&#xff1b; 1. 以中国在内的多个国家为目标的网络攻击中发现 DinodasRAT的Linux版本 卡巴斯基的最新发现揭示&#xff0c;一款名为DinodasRAT的多平台后…

《Effective C++》《构造/析构/赋值运算——7、为多态基类声明virtual析构函数》

文章目录 1、term7:Declare destructors virtual in polymorphic base classes2、总结3、相关面试题3.1 析构函数在什么情况下声明为虚函数 4、参考 1、term7:Declare destructors virtual in polymorphic base classes 带有多态性质的基类应该声明一个virtual析构函数&#x…

论文阅读-多级检查点重新启动MPI应用的共同设计

论文名称&#xff1a;Co-Designing Multi-Level Checkpoint Restart for MPI Applications 摘要—高性能计算&#xff08;HPC&#xff09;系统继续通过包含更多硬件组件来支持更大的应用部署来扩展。关键是&#xff0c;这种扩展往往会减少故障之间的平均时间&#xff0c;从而使…