我是斯威夫特的新手。计算属性和设置为闭包的属性之间有什么区别?我知道每次都会重新计算计算的属性。关闭的时候不一样吗?即
闭包:
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
}
}发布于 2015-07-20 12:05:43
简而言之,第一个是通过闭包初始化的存储属性,当它被初始化时,该闭包只被调用一次。第二个是计算属性,每次引用该属性时都会调用该属性的get块。
存储的属性的初始化闭包只调用一次,但稍后可以更改存储属性的值(除非用var替换为let)。当您想要封装代码以在单个简洁的代码块中初始化存储的属性时,这是非常有用的。
但是,每次引用变量时都会调用计算出的属性的块。当您希望每次引用计算属性时都调用代码时,这是非常有用的。通常,当每次引用存储的属性时都需要重新计算计算的属性(例如,从其他(可能是私有的)存储属性重新计算)时,通常会这样做。
在这种情况下,您无疑需要存储的属性(第一个示例),而不是计算属性(第二个示例)。您大概不希望每次引用变量时都要一个新的push behavior对象。
顺便说一句,在第一个示例中,您在内部引用它是延迟实例化的。如果您想要这种行为,您必须使用lazy关键字:
lazy var pushBehavior: UIPushBehavior = {
let behavior = UIPushBehavior()
behavior.setAngle(50, magnitude: 50)
return behavior
}()但是,如果属性是static,则自动延迟实例化。
发布于 2016-11-23 06:18:20
关闭:
//closure
var pushBehavior: UIPushBehavior = {
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}()第一次调用pushBehavior变量时,将块执行和值保存在pushBehavior变量中。之后,无论何时调用pushBehavior,都会返回这些值。
意味着只有在这个变量中执行和保存的第一次块代码。此外,您可以随时存储变量值,但在此之后,这些值将返回,但如果声明为"let“,则不能更改此值。
计算财产:
var pushBehavior: UIPushBehavior {
get{
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}
}在计算属性中,每当调用pushBehavior变量时,该块执行并返回值。所以每次执行块。您也不能将变量声明为pushBehavior变量的"let“关键字。
因此,您可以根据需要使用此代码。
发布于 2015-07-20 12:02:32
主要的区别是您不能将某些东西分配给计算属性,因为它没有setter。在这种情况下,只调用一次闭包,返回值存储在变量中,因此如果结果不随时间变化,则使用存储变量而不是计算变量更有效。
一般情况下:只有当可以快速检索值时,才应使用计算的属性。
Sidenote:如果不更改/重新分配存储的变量,则应考虑将其设置为常量(let)
https://stackoverflow.com/questions/31515805
复制相似问题