计算属性与使用闭包设置的属性之间的差异

bak*_*olo 59 swift computed-properties

我是Swift的新手.计算属性和设置为闭包的属性之间有什么区别?我知道每次都会重新计算计算属性.闭合不同吗?即

关闭:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()
Run Code Online (Sandbox Code Playgroud)

计算:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 100

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

存储属性的初始化闭包只调用一次,但您可以稍后更改存储属性的值(除非替换varlet).当您想要封装代码以在单个简洁的代码块中初始化存储的属性时,这非常有用.

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

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


顺便说一句,在你的第一个例子中,你在内部引用它被懒惰地实例化.如果您想要该行为,则必须使用以下lazy关键字:

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()
Run Code Online (Sandbox Code Playgroud)

但是,如果属性是static,则会自动实例化.

  • 很棒的解释.. !! ;) (3认同)

Qby*_*yte 5

主要区别在于您无法为计算属性分配内容,因为它没有setter.在这种情况下,闭包只被调用一次,返回值存储在变量中,因此如果结果不随时间变化,则使用存储的变量而不是计算变量更有效.

通常:只有在可以快速检索值时才应使用计算属性.

旁注:如果不更改/重新分配存储的变量,则应考虑将其设为常量(let)


vik*_*ati 5

关闭:

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()
Run Code Online (Sandbox Code Playgroud)

第一次调用pushBehavior变量时阻塞执行并将值保存在pushBehavior变量中.之后,每当您调用pushBehavior时,都会返回这些值.

表示仅执行并保存在此变量中的第一次块代码.此外,您可以随时存储变量值,但在此之后,返回这些值,但如果您声明为"let",则无法更改此值.

计算财产:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}
Run Code Online (Sandbox Code Playgroud)

在您调用pushBehavior变量时的computed属性中,此块执行并返回值.所以每次执行块都是如此.并且您不能将变量声明为pushBehavior变量的"let"关键字.

因此,您可以根据您的要求使用此代码.