Z
ZHANK
函数与闭包

闭包 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)
        }
    }
}