在 Swift 中使用“= {}()”声明时 class 属性 的性质是什么?

What is the nature of a class property when declared with "= {}()" in Swift?

我有一些示例代码中的 Swift class,其中有一个 属性 captureSession 声明如下:

private lazy var captureSession: AVCaptureSession = {
    let session = AVCaptureSession()

    guard
        let backCamera = AVCaptureDevice.default(for: .video),
        let input = try? AVCaptureDeviceInput(device: backCamera)
        else { return session }
    session.addInput(input)
    return session
}()

我不认为 captureSession 是计算的 属性,也不是闭包。那又是什么呢?

这是惰性初始化。当创建初始值相对昂贵时,通常会使用它。所以当你确定你需要它时,你就创造了价值。所以 captureSession 将在您第一次访问它时创建,然后存储在 captureSession 变量中。

语法 ={}() 描述了一个闭包(匿名函数),它在您访问 属性 时被调用。这个闭包 return 类型是 AVCaptureSession.

换句话说:使用 lazy var a: SomeType = { ... }() 可以推迟对象 a 的创建,直到您真正需要它为止。当你第一次访问它时,变量 a 将取一个闭包的结果。


我喜欢写的解释 here, Official documentation 也很有帮助。

Lazy properties allow you to create certain parts of a Swift type when needed, rather than doing it as part of its initialization process. This can be useful in order to avoid optionals, or to improve performance when certain properties might be expensive to create. It can also help with keeping initializers more clean, since you can defer some of the setup of your types until later in their lifecycle.

简而言之,在您第一次访问它之前不会创建 captureSession 实例,实例化后每次都会 return 相同的实例。

这种方法的优点是您可以将 属性 声明及其设置保存在一个地方。

这是一篇关于惰性初始化的好文章:Using lazy properties in Swift

captureSession 是惰性的 属性 但 ={}() 与惰性初始化无关。 是Setting a Default Property Value with a Closure or Function。这是一个例子。

let titleLabel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = UIColor.textColor
    label.font = UIFont(name: "HelveticaNeue-Medium", size: 14)
    return label
}()

您可以在本文末尾找到更多信息 document