我有一些示例代码中的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
是计算属性,也不是闭包。那是什么?
答案 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