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

时间:2018-11-22 07:28:41

标签: ios swift avcapturesession

我有一些示例代码中的Swift类,并且其中声明了一个属性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是计算属性,也不是闭包。那是什么?

3 个答案:

答案 0 :(得分:5)

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的末尾找到更多信息。

答案 1 :(得分:3)

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

语法={}()描述了一个闭包(匿名函数),当您访问属性时会调用该闭包。此闭包返回类型为AVCaptureSession

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


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

答案 2 :(得分:1)

  

惰性属性允许您在需要时创建Swift类型的某些部分,而不是将其作为初始化过程的一部分。为了避免使用可选属性,或者在某些属性的创建成本可能很高的情况下提高性能,这可能很有用。它也可以帮助保持初始化程序的整洁,因为您可以将类型的某些设置推迟到生命周期的后期。

用简单的话说,除非您第一次访问它,否则不会创建captureSession实例,并且实例化后每次都会返回相同的实例。

这种方法的优点是可以将属性声明及其设置都放在一个位置。

这是一篇关于延迟初始化的不错的文章:Using lazy properties in Swift