一、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 库的优势与适用场景
优势:
- 代码更简洁:把分散的属性赋值整合到链式闭包中,减少临时变量和冗余代码。
- 可读性更高:对象创建和配置逻辑集中,一眼就能看出对象的完整配置。
- 类型安全:闭包内的
$0自动推导类型,享受 Xcode 的自动补全,避免手写对象名出错。 - 轻量级:源码只有几百行,无额外依赖,接入成本极低。
适用场景:
- UIKit 控件的初始化配置(iOS 开发最核心场景)。
- 自定义类 / 结构体的批量属性赋值。
- 测试代码中快速创建配置好的对象。
- 任何需要 "创建 + 配置" 两步操作的场景。
总结
- 核心功能:Then 库为 Swift 任意类型提供
then/do方法,实现对象创建与配置的链式写法,替代逐行赋值的冗余代码。 - 核心用法:
对象.then { $0.属性 = 值 },$0代表对象本身,支持所有类型(包括可选类型)。 - 核心优势:代码更简洁、可读性更高,尤其适合 UIKit 控件配置,是 iOS 开发中提升编码效率的经典语法糖。