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