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

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

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

增加整数输入类型

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

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

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

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

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

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

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

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

增加自定义输入类型

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

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

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

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

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

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

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

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

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

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

看看最后的结果:

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

是不是很酷呢?

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广东小团队惊艳业绩揭秘:链动模式助力面膜销售破千万!

惊爆!广东一个默默无闻的小团队竟然在短短一个月内,仅凭销售面膜就实现了超过千万的惊人业绩!这背后究竟隐藏着怎样的秘密武器呢? 揭开链动模式的神秘面纱 链动模式,作为社交电商领域的一股新兴力量,正以其…

[Python学习篇] Python注释

注释 单行注释 # # 单行注释 多行注释 """ """ 多行注释1 多行注释2 """ 多行注释 多行注释1 多行注释2

【强化学习的数学原理-赵世钰】课程笔记(一)基本概念

目录 一. 内容概述1. 通过案例介绍强化学习中的基本概念2. 在马尔可夫决策过程(MDP)的框架下将概念正式描述出来 二. 通过案例介绍强化学习中的基本概念1. 网格世界(A grid world example)2. 状态(State)3.…

Spring AOP + 自定义注解 实现公共字段的填充

Spring AOP 自定义注解 实现公共字段的填充 代码冗,不利于后期维护. 定义操作这些字段的方法类型 实现步骤: 自定义注解AutoFill,用于表示操作这些公共字段的方法自定义切面类AutoFillAspect,统一拦截,通过反射获取方法入参,并填充公共字段…

mysql常见故障及mysql优化

目录 mysql单实例常见故障 mysql主从常见故障 mysql优化 硬件优化 查询优化 操作系统的优化 my.cnf内参数的优化 mysql单实例常见故障 ERROR 2002 (HY000): Cant connect to local MySQL server through scoket /data/mysql/mysql.sock问题分析 数据库未启动或者数据库…

【THM】Burp Suite:Other Modules(其他模块)-初级渗透测试

介绍 除了广泛认可的Repeater和Intruder房间之外,Burp Suite 还包含几个鲜为人知的模块。这些将成为这个房间探索的重点。 重点将放在解码器、比较器、排序器和组织器工具上。它们促进了编码文本的操作,支持数据集的比较,允许分析捕获的令牌内的随机性,并帮助您存储和注释…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。…

MongoDB 6.1 及以上版本使用配置文件的方式启动报错 Unrecognized option: storage.journal.enabled

如果你使用的 MongoDB 的版本大于等于 6.1,并且在 MongoDB 的配置文件中编写了如下内容 storage:journal:# 启用或禁用持久性日志以确保数据文件保持有效和可恢复# true 启用;false 不启用# 64 位系统默认启用,启用后 MongoDB 可以在宕机后根…

Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道, 无名管道:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销 有名管道:进程间不需…

RK3568驱动指南|第十四篇 单总线-第162章DS18B20驱动读时序编写

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

秒验资深玩家熬夜整理的15个常见问题,拿走不谢!

1、双卡双待手机如何登录? 针对双卡双待手机只取当前流量卡号 2、用其他手机号如何登录? 使用传统验证方式登录,例如验证码登录 3、一键登录只支持4G吗? 电信支持4G,5G网络取号,移动, 联通支持5G,4G, 3G, 2G网络取号…

数值金额计算js封装包含加减乘除四个方法,能确保浮点数运算不丢失精度

项目场景: 商城类项目中大多需要金额计算,我们知道计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差),其根本原因是二进制和实现位数限制有些数无法有限表示 以下是十进制小数对应的二进制表示&#xff1…

python笔记(8)Tuple(元组)

目录 创建元组 元组取数 不支持修改和删除元素 元组运算符 元组内置函数 创建元组 Tuple 元组的元素不能修改,元组使用小括号(),创建元组在括号里添加元素用逗号隔开即可。 创建空元组 tup1() 创建一个元素的元组&#xff…

Golang 开发实战day06 - Boolean Conditional

Golang 教程06 - Boolean & Conditional 1. Boolean & Conditional 1.1 什么是布尔类型? 想象一下,你正在玩一个古老的游戏,只有两个选项:是或否。在 Golang 中,这就是布尔类型,用 bool 关键字表…

【Linux实验室】DNS域名解析服务——超详细实验操作!

DNS域名解析 DNS域名解析服务——超详细实验操作!!!序言DNS 基本概述分布式、层次数据库DNS 层次结构DNS 查询步骤DNS 查询类型DNS服务器类型DNS 缓存反向 DNS 查询如何检查 DNS 记录是否生效 Bind解析服务Bind简介bind的服务类型 DNS域名解析…

深入解析实时数仓Doris:Rollup上卷表与查询

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、基本概念二、Aggregate 和 Unique 模型中的 ROLLUP三、Duplicate 模型中的 ROLLUP四、ROLLUP 调整前缀索引五、ROLLUP使…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立,可以参考我的博客: 【深耕 Python】Data Science with Python 数据科学(1)环境搭建 往期数据科学博文: 【深耕 Python】Data Science with Python 数据科学(2&#xf…

Android 使用LeakCanary检测内存泄漏,分析原因

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时,少量的内存泄漏我们是发现不了的,但是当内存泄漏达到一定数量时&…

每日面经分享(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件,编写以下测试脚本 import pytest import requests# 测试用例1:验证登录成功的情况 # 第一个测试用例验证登录成功的情况,发送有效的用户名和密…

统计数码出现的个数

题目描述 输入一个数n,求出 [1, n] 中每个数码出现的次数,即0 - 9每个数出现的次数。 解题思路 首先是无情的暴力法,可以用于判断我们后续的优化代码是否正确。 import java.io.*; import java.util.*;public class Main1 {static int n;p…