当前位置: 首页 > news >正文

Swift:优雅又强大的语法糖——Then库

一、Then 库的核心概念

Then 是一款轻量级的 Swift 第三方库,核心作用是为任意类型(结构体、类、枚举等)提供一个then方法,让你可以在创建对象后直接链式配置属性,替代繁琐的 "先创建对象、再逐行赋值" 的写法。
简单来说,它把这样的冗余代码:
swift
let label = UILabel()
label.text = "Hello"
label.textColor = .red
label.font = UIFont.systemFont(ofSize: 16)
label.frame = CGRect(x: 20, y: 40, width: 200, height: 30)
 
变成更优雅的链式代码:
swift
let label = UILabel().then {$0.text = "Hello"$0.textColor = .red$0.font = UIFont.systemFont(ofSize: 16)$0.frame = CGRect(x: 20, y: 40, width: 200, height: 30)
}
 

二、安装 Then 库

Then 支持 CocoaPods、Swift Package Manager(SPM)等主流安装方式,最常用的是 SPM(Xcode 内置,无需额外工具):

1. Swift Package Manager(推荐)

  • 打开 Xcode 项目 → 点击项目文件 → 选择 "Package Dependencies" → 点击 "+"。
  • 输入 Then 的仓库地址:https://github.com/devxoul/Then
  • 选择最新版本,点击 "Add Package" 完成安装。

2. CocoaPods

Podfile中添加:
ruby
 
 
 
 
 
pod 'Then'
 
然后执行终端命令:
bash
 
运行
pod install
 

三、Then 库的基础用法

1. 基础对象配置(最核心场景)

适用于 UIKit 控件、自定义类、结构体等所有类型,核心是then方法接收一个闭包,闭包参数是对象本身($0):
swift
import UIKit
import Then// 1. UI控件配置(最常用)
let button = UIButton(type: .system).then {$0.setTitle("点击我", for: .normal)$0.setTitleColor(.white, for: .normal)$0.backgroundColor = .blue$0.layer.cornerRadius = 8$0.frame = CGRect(x: 20, y: 100, width: 120, height: 40)
}// 2. 自定义类配置
class Person {var name: String = ""var age: Int = 0var hobby: [String] = []
}let person = Person().then {$0.name = "张三"$0.age = 25$0.hobby = ["读书", "编程"]
}// 3. 结构体配置
struct Book {var title: Stringvar price: Double
}let book = Book(title: "", price: 0).then {$0.title = "Swift编程"$0.price = 89.9
}
 

2. do方法(无返回值的配置)

如果不需要返回对象(仅想链式执行配置),可以用do方法(效果和then一致,只是闭包无返回值):
swift
// 场景:给已存在的对象做配置
let view = UIView()
view.do {$0.backgroundColor = .gray$0.frame = CGRect(x: 0, y: 0, width: 300, height: 200)
}
 

3. 可选类型的配置

Then 也支持可选类型(Optional),通过then配置时会自动解包(仅当可选值非 nil 时执行闭包):
swift
// 可选UIView
var optionalView: UIView? = UIView()
optionalView?.then {$0.backgroundColor = .yellow
}// 若可选值为nil,闭包不会执行
var nilView: UIView? = nil
nilView?.then {$0.backgroundColor = .black // 不会执行
}
 

四、Then 库的进阶场景

1. 结合数组 / 集合使用

可以批量配置数组中的对象:
swift
// 创建并配置多个标签
let labels = (0..<3).map { index inUILabel().then {$0.text = "标签\(index + 1)"$0.textAlignment = .center$0.frame = CGRect(x: 20, y: 150 + CGFloat(index * 40), width: 100, height: 30)$0.backgroundColor = .lightGray}
}
 

2. 自定义类型扩展(让 Then 更贴合业务)

可以给自定义协议 / 类扩展 Then 的能力(虽然 Then 已默认支持所有类型,但可封装通用配置):
swift
 
// 扩展UIButton,封装通用样式
extension UIButton {func configPrimaryButton() -> Self {return then {$0.setTitleColor(.white, for: .normal)$0.backgroundColor = .systemBlue$0.layer.cornerRadius = 6$0.titleLabel?.font = .systemFont(ofSize: 15, weight: .medium)}}
}// 使用封装的配置
let primaryButton = UIButton().configPrimaryButton().then {$0.setTitle("主按钮", for: .normal)$0.frame = CGRect(x: 20, y: 250, width: 150, height: 44)
}
 

3. 结合闭包捕获值

then闭包中可以捕获外部变量,实现动态配置:
swift
let baseY: CGFloat = 300
let buttonCount = 2for i in 0..<buttonCount {let btn = UIButton().then {$0.setTitle("动态按钮\(i+1)", for: .normal)$0.frame = CGRect(x: 20, y: baseY + CGFloat(i * 50), width: 120, height: 40)$0.backgroundColor = .systemGreen}// 假设添加到视图// view.addSubview(btn)
}
 

五、Then 库的优势与适用场景

优势:

  1. 代码更简洁:把分散的属性赋值整合到链式闭包中,减少临时变量和冗余代码。
  2. 可读性更高:对象创建和配置逻辑集中,一眼就能看出对象的完整配置。
  3. 类型安全:闭包内的$0自动推导类型,享受 Xcode 的自动补全,避免手写对象名出错。
  4. 轻量级:源码只有几百行,无额外依赖,接入成本极低。

适用场景:

  • UIKit 控件的初始化配置(iOS 开发最核心场景)。
  • 自定义类 / 结构体的批量属性赋值。
  • 测试代码中快速创建配置好的对象。
  • 任何需要 "创建 + 配置" 两步操作的场景。

总结

  1. 核心功能:Then 库为 Swift 任意类型提供then/do方法,实现对象创建与配置的链式写法,替代逐行赋值的冗余代码。
  2. 核心用法对象.then { $0.属性 = 值 }$0代表对象本身,支持所有类型(包括可选类型)。
  3. 核心优势:代码更简洁、可读性更高,尤其适合 UIKit 控件配置,是 iOS 开发中提升编码效率的经典语法糖。
http://www.rkmt.cn/news/131695.html

相关文章:

  • Introducing Qwen-Image-Layered: A Free AI Photoshop Alternative for Image Layer Editing
  • LeetCode华为大模型岗刷题 - 指南
  • 揭秘Open-AutoGLM与Applitools核心差异:5大维度全面对比
  • 学术探索新利器:书匠策AI——本科硕士论文写作的智能导航仪
  • 学术探索新伙伴:解锁书匠策AI科研工具中的本科硕士论文写作“宝藏功能”
  • 剖析CVE-2024-58318:Kentico Xperience存储型XSS漏洞技术详解
  • 科研不必单打独斗:揭秘你的“隐形学术搭子”如何用AI重构论文写作
  • 为什么没人走后门干程序员?
  • 【2024最新实测数据】:Open-AutoGLM与WinAutomation响应速度差多少?
  • Open-AutoGLM与Selenium手机端兼容性全解析(90%团队忽略的关键差异)
  • 【开题答辩全过程】以 基于SpringBoot的企业资产管理系统的设计与实现为例,包含答辩的问题和答案
  • 2025年市场专业的高效粉碎机订做厂家选哪家,JGF-B系列高效粉碎机 /JGF-C系列高效粉碎机厂家口碑推荐 - 品牌推荐师
  • AI原生应用领域多租户系统的测试与部署要点
  • 【移动端自动化适配避坑指南】:Open-AutoGLM与Selenium的5大核心差异及应用场景分析
  • 【专家视角】Open-AutoGLM与Power Automate如何抉择?3年实战总结的7条铁律
  • 985本硕进不去大厂,是不是很丢人?
  • 从零开始学昇腾Ascend C算子开发-第三篇:算子开发基础
  • 详细介绍:Linux网络TCP(中)(12)
  • Open-AutoGLM报价自动化落地实践(90%企业忽略的关键细节)
  • 【急急急】上海进出口权办理流程需要哪些材料?多长时间?多少费用? - 速递信息
  • 【Java毕设全套源码+文档】基于springboot的电影播放平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 从零开始学昇腾Ascend C算子开发-第四篇:常用算子实现
  • Open-AutoGLM自动保存性能优化指南(仅限高级用户访问)
  • Open-AutoGLM与WinAutomation性能对决:5大关键指标全面解析
  • Open-AutoGLM实战应用(联系人整理黑科技):效率提升90%的秘诀曝光
  • 学术写作新纪元:解锁书匠策AI,本科硕士论文的智能导航利器
  • 学术写作新纪元:解锁书匠策AI,本科硕士论文的智能导航利器
  • Open-AutoGLM合同条款审核全解析(企业法务必看的AI合规利器)
  • 学术新次元启航:书匠策AI——本科硕士论文写作的智慧灯塔
  • 如何用Open-AutoGLM实现每日万级邮件自动分拣?一线架构师亲授秘诀