一尘不染

计算属性和带闭包的属性集之间的区别

swift

我是Swift的新手。计算属性和设置为闭包的属性之间有什么区别?我知道每次都会重新计算一个计算属性。封盖是否有所不同?即

关闭:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

计算:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

阅读 392

收藏
2020-07-07

共1个答案

一尘不染

第一个是通过闭包初始化的存储属性。第二个是计算属性。

存储的属性的初始化关闭被调用一次,只有一次,但你可以改变存储的属性值(除非您更换varlet)。当您希望封装代码以在单个简洁的代码块中初始化存储的属性时,此功能很有用。

但是,每次引用变量时都会调用计算属性的块。当您希望每次引用计算属性时都调用代码时,这很有用。通常,当每次引用存储的属性时都需要重新计算计算的属性时(例如,从其他可能是私有的存储属性重新计算),您可以执行此操作。

在这种情况下,您无疑需要存储的属性(第一个示例),而不是计算的属性(第二个示例)。您大概每次引用该变量时都不需要新的推送行为对象。


顺便说一下,在第一个示例中,您内部引用了它的实例化。如果您想要这种行为,则必须使用lazy关键字:

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

但是,如果属性为static,则将自动延迟实例化。

2020-07-07