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
第一个是通过闭包初始化的存储属性.第二个是计算属性.
存储属性的初始化闭包只调用一次,但您可以稍后更改存储属性的值(除非替换var
为let
).当您想要封装代码以在单个简洁的代码块中初始化存储的属性时,这非常有用.
但是,每次引用变量时都会调用计算属性的块.当您希望每次引用计算属性时都调用代码时,它很有用.通常,当每次引用存储的属性时需要重新计算计算属性时(例如,从其他可能是私有的存储属性重新计算),这样做.
在这种情况下,您无疑需要存储属性(第一个示例),而不是计算属性(第二个示例).每次引用变量时,您可能不希望有新的推送行为对象.
顺便说一句,在你的第一个例子中,你在内部引用它被懒惰地实例化.如果您想要该行为,则必须使用以下lazy
关键字:
lazy var pushBehavior: UIPushBehavior = {
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}()
Run Code Online (Sandbox Code Playgroud)
但是,如果属性是static
,则会自动实例化.
主要区别在于您无法为计算属性分配内容,因为它没有setter.在这种情况下,闭包只被调用一次,返回值存储在变量中,因此如果结果不随时间变化,则使用存储的变量而不是计算变量更有效.
通常:只有在可以快速检索值时才应使用计算属性.
旁注:如果不更改/重新分配存储的变量,则应考虑将其设为常量(let
)
//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"关键字.
因此,您可以根据您的要求使用此代码.
归档时间: |
|
查看次数: |
12201 次 |
最近记录: |