闭包 Closure
闭包语法/简写、捕获列表 [weak self]、逃逸 @escaping
闭包 Closure
Swift 闭包语法极其简洁——$0 缩写、尾随闭包、捕获列表 [weak self] 防止循环引用。
学完本章你将: 掌握闭包语法/简写、尾随闭包、@escaping、捕获列表。
闭包语法演变
swift
let names = ["Chris", "Alex", "Ewa", "Barry"]
// 完整写法
names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 < s2
})
// 省略类型
names.sorted(by: { s1, s2 in return s1 < s2 })
// 隐式返回
names.sorted(by: { s1, s2 in s1 < s2 })
// $0 $1 缩写
names.sorted(by: { $0 < $1 })
// 运算符方法
names.sorted(by: <)
尾随闭包(Trailing Closure)
swift
// 闭包作为最后一个参数——可以写在括号外面
names.sorted { $0 < $1 }
// 多个尾随闭包(Swift 5.3+)
UIView.animate(withDuration: 0.3) {
view.alpha = 0 // 第一个闭包省略标签
} completion: { _ in
view.removeFromSuperview() // 第二个需要标签
}
@escaping 与捕获列表
swift
// @escaping —— 闭包在函数返回后执行(如异步回调)
func fetch(completion: @escaping (Data?) -> Void) {
DispatchQueue.global().async {
let data = loadData()
completion(data) // 异步执行
}
}
// [weak self] —— 防止循环引用
class ViewController {
func setup() {
network.fetch { [weak self] data in
guard let self = self else { return }
self.updateUI(with: data)
}
}
}