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

标签 swift computed-properties

我是 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
    }
}

最佳答案

简而言之,第一个是通过闭包初始化的存储属性,闭包在初始化时仅被调用一次。第二个是计算属性,每次引用该属性时都会调用其 get block 。


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

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

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


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

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

但是,如果该属性是static,它会自动延迟实例化。

关于swift - 计算属性和带闭包的属性集之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31515805/

相关文章:

vue-component - Vuetify 数据表行中的计算属性

ios - 使用转换(_ :to:) method in swift

iOS 立即关闭 NFCTagReaderSession 结果 View

swift - NSURLSession 数据任务响应处理

polymer - 手动重新计算 'computed properties'

javascript - Ember.js:在服务的 Handlebars 中使用计算属性

ios - 为什么我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据, swift )

ios - 无法更改其中的搜索栏和文本字段的高度

ios - 删除第三方键盘 "Add New Keyboard..."屏幕上的字幕

ios - 计算属性 : different types between get and set