iOS链式编程风格 -- 富文本字符串
一、概念
链式编程风格是一种将多个函数调用连接起来,形成一条函数调用链的编程风格。这种风格的代码可以通过返回 self
或某个适当的对象来实现。
1.优点
- 代码简洁、连贯、易于阅读。
- 可以将一个方法的输出直接作为下一个方法的输入,降低中间变量的使用。
2.缺点
- 链式调用过长可能会导致代码可读性降低。
- 由于错误可能出现在链的任何一环,所以调试可能会有所困难。
二、代码
下面是一个使用链式编程风格构建的 NSMutableAttributedString 的例子,这个例子将展示如何将一系列的 NSAttributedString 配置操作链接在一起。
首先,我们需要创建一个类 ChainableAttributedBuilder
,它可以用于创建和配置 NSAttributedString:
1..h文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ChainableAttributedBuilder : NSObject
@property (nonatomic, strong, readonly) NSMutableAttributedString *mutableAttributedString;
- (ChainableAttributedBuilder *(^)(NSString *text))append;
- (ChainableAttributedBuilder *(^)(UIColor *color))textColor;
- (ChainableAttributedBuilder *(^)(UIFont *font))font;
- (ChainableAttributedBuilder *(^)(NSParagraphStyle *style))paragraphStyle;
@end
NS_ASSUME_NONNULL_END
2..m文件
#import "ChainableAttributedBuilder.h"
@implementation ChainableAttributedBuilder
- (instancetype)init {
if (self = [super init]) {
_mutableAttributedString = [[NSMutableAttributedString alloc] init];
}
return self;
}
- (ChainableAttributedBuilder *(^)(NSString *text))append {
return ^(NSString *text) {
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text];
[self.mutableAttributedString appendAttributedString:attributedString];
return self;
};
}
- (ChainableAttributedBuilder *(^)(UIColor *color))textColor {
return ^(UIColor *color) {
[self.mutableAttributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
- (ChainableAttributedBuilder *(^)(UIFont *font))font {
return ^(UIFont *font) {
[self.mutableAttributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
- (ChainableAttributedBuilder *(^)(NSParagraphStyle *style))paragraphStyle {
return ^(NSParagraphStyle *style) {
[self.mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
@end
3.调用代码
ChainableAttributedBuilder *builder = [[ChainableAttributedBuilder alloc] init];
builder.append(@"Hello ").font([UIFont systemFontOfSize:16]).textColor([UIColor redColor]);
builder.append(@"world!").font([UIFont systemFontOfSize:20]).textColor([UIColor blueColor]);
NSAttributedString *attributedString = builder.mutableAttributedString;
// 现在,attributedString 是一个带有不同样式的 "Hello world!" 的富文本字符串。
相关文章:
iOS链式编程风格 -- 富文本字符串
一、概念 链式编程风格是一种将多个函数调用连接起来,形成一条函数调用链的编程风格。这种风格的代码可以通过返回 self 或某个适当的对象来实现。 1.优点 代码简洁、连贯、易于阅读。可以将一个方法的输出直接作为下一个方法的输入,降低中间变量的使…...
后端开发5.Redis的搭建
使用docker安装 Redis【redis】(6379) 拉取Redis镜像 docker pull redis:6.2.6 启动Redis容器 docker run -di --name=redis -p 6379:6379 redis:6.2.6 启动Redis容器并设置密码 docker run -di --name=redis -p 6379:6379 redis:6.2.6 --requirepass "密码" 测…...

推特群推王构建你的流量池
随着社交媒体的兴起,推特已成为了一个信息传播、交流、互动的重要平台。在这个充满了各种声音和观点的数字世界里,如何有效地将自己的声音传达出去,吸引更多的关注和互动,已经成为了一个备受关注的话题。而在这个过程中࿰…...

【从零学习python 】12.Python字符串操作与应用
文章目录 学习目标字符串介绍字符串表示方式小总结转义字符 下标和切片一、 下标/索引1. 如果想取出部分字符,那么可以通过下标的方法,(注意在计算机中,下标从 0 开始)2. 遍历3. 切片 进阶案例 学习目标 字符串的表示…...

MongoDB创建用户 、数据库、索引等基础操作
MongoDB的权限认证是相对来说比较复杂的,不同的库创建后需要创建用户来管理。 本机中的MongoDB是docker 启动的,所以先进入docker的镜像中 docker exec -it mongodb bash 这样就进入到了镜像MongoDB中,然后输入命令连接MongoDB数据库 注…...

Docker容器监控(Cadvisor +Prometheus+Grafana)
环境部署,接着上一篇文章Docker容器部署(Cadvisor InfluxDBGrafana)开始 目录 1、先清理一下容器 2、部署Cadvisor 3、访问Cadvisor页面 4、部署Prometheus 5、准备配置 6、运行prometheus容器 7、访问prometheus页面 8、部署Grafan…...

家电用PCM板:市场现状研究分析与发展前景预测
家电PCM板属于一种兴起不久的功能性复合材料。属于家电复合外观材料中占比较大的一种。家电复合外观材料主要分为覆膜板(VCM)系列和有机涂层板(PCM)系列两大类:VCM系列表面复合各类功能性薄膜,可根据需要实…...

详解lambda表达式(一):表达式定义与异常处理
目录 一、lambda表达式 二、lambda表达式实现函数接口 2.1 函数式接口 2.2 lambda表达式实现无参抽象方法 2.3 lambda表达式实现有参抽象方法 2.4 lambad表达式使用代码块 三、lambda表达式调用外部变量 3.1 lambda表达式可以更改类成员变量 3.2 lambda表达式无法更改…...

UE5、CesiumForUnreal接入WMTS格式地图瓦片,如ArcGIS、Mapbox、天地图
文章目录 1.实现目标2.实现过程2.1 WMTS与TMS2.2 cesium-native改造2.3 CesiumForUnreal插件改造2.4 WMTS瓦片加载测试2.5 EPSG:3857与43263.参考资料1.实现目标 通过改造cesium-native和CesiumForUnreal插件,参考tms的栅格瓦片地图加载逻辑,实现在UE5中通过CesiumForUnreal…...

AI模型公司如何定位 ?
AI模型公司如何定位 ? 企业与消费者? 和 多用途与利基市场? 文本将分解每个象限。 消费类和多用途 最有价值的象限并引发了人工智能热潮。 顶级公司: Open AI - 通过 ChatGPT 为消费者构建,并通过其旗舰 GPT 模型为企…...

C#,OpenCV开发指南(01)
C#,OpenCV开发指南(01) 一、OpenCV的安装1、需要安装两个拓展包:OpenCvSharp4和OpenCvSharp4.runtime.win 二、C#使用OpenCV的一些代码1、需要加头文件2、读取图片3、在图片上画矩形框4、 在图片上画直线 一、OpenCV的安装 1、需…...

windows永久关闭更新
不要去services.msc 服务里面关闭windowUpdata了,对win11和部分win10根本不管用,下面在教你一招永久关闭(原理不是关闭,只是延长更新时间,时间可以设置百年后,所以和关闭差不多) windows图形化…...
python类型转换笔记.python运算符笔记
进制 现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。 在二进制的基础上,计算机还支持八进制和十六进制这两种进制。 除了计算机里的进制以外,我们生活中经常用到的是十进制。 Pyt…...

【CSS】背景图定位问题适配不同机型
需求 如图, 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 , 需要适配不同的机型, 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的, 所以飘带和渐变背景实则两个div 飘带切图如下 , 圆形部分需要契合头像 <view class"box-bg"><…...

20 个实例玩转 Java 8 Stream
先贴上几个案例,水平高超的同学可以挑战一下: 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。统计员工的最高薪资、平均薪资、薪资之和。将员工按薪资从高到低排序,同样薪资者年龄小者在前。将员工按性别分类&…...
局部变量数组和malloc申请的指针使用区别和注意事项
函数内定义的局部变量的大数组和通过malloc申请的指针在使用时有几个主要的区别和注意事项: 内存位置:函数内定义的局部变量的大数组通常在栈上分配内存,而通过malloc申请的指针分配的内存位于堆上。 生命周期:局部变量的大数组的…...
Springboot2.5.6整合Elasticsearch7.12.1完整示例
Springboot2.5.6整合Elasticsearch7.12.1完整示例 SpringBoot是2.5.6,elasticsearch是7.12.1 使用依赖elasticsearch-rest-high-level-client 使用RestHighLevelClient操作 1、引入Pom文件的依赖 <?xml version"1.0" encoding"UTF-8"?…...

全网超全,接口自动化测试-动态数据生成/替换数据(实战应用)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口自动化过程中…...
CRUD操作-select
CRUD操作-select 基本查询(一) -- CRUD操作 -- insert into -- insert -- replace intouse dbok; show tables; drop table if exists t5,t6,t_stu,t_student,t_teacher;-- 建立学生表 create table t_student(sid int unsigned auto_increment,sname v…...
SD-WAN网络加速及应用场景分析
SD-WAN技术实现网络加速的主要方式有以下几个: 智能路由:SD-WAN技术可以自动智能地选择最佳路径,将数据流量传输到最优路线上,从而避免了传统VPN网络较为笨重的配置和管理方式,大大节省了时间和精力,提高了…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...