首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算性质与有闭包属性集的差异

计算性质与有闭包属性集的差异
EN

Stack Overflow用户
提问于 2015-07-20 11:51:52
回答 4查看 21.5K关注 0票数 85

我是斯威夫特的新手。计算属性和设置为闭包的属性之间有什么区别?我知道每次都会重新计算计算的属性。关闭的时候不一样吗?即

闭包:

代码语言:javascript
复制
var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

计算:

代码语言:javascript
复制
var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-20 12:05:43

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

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

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

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

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

代码语言:javascript
复制
lazy var pushBehavior: UIPushBehavior = {
    let behavior = UIPushBehavior()
    behavior.setAngle(50, magnitude: 50)
    return behavior
}()

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

票数 137
EN

Stack Overflow用户

发布于 2016-11-23 06:18:20

关闭:

代码语言:javascript
复制
  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

第一次调用pushBehavior变量时,将块执行和值保存在pushBehavior变量中。之后,无论何时调用pushBehavior,都会返回这些值。

意味着只有在这个变量中执行和保存的第一次块代码。此外,您可以随时存储变量值,但在此之后,这些值将返回,但如果声明为"let“,则不能更改此值。

计算财产:

代码语言:javascript
复制
var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

在计算属性中,每当调用pushBehavior变量时,该块执行并返回值。所以每次执行块。您也不能将变量声明为pushBehavior变量的"let“关键字。

因此,您可以根据需要使用此代码。

票数 7
EN

Stack Overflow用户

发布于 2015-07-20 12:02:32

主要的区别是您不能将某些东西分配给计算属性,因为它没有setter。在这种情况下,只调用一次闭包,返回值存储在变量中,因此如果结果不随时间变化,则使用存储变量而不是计算变量更有效。

一般情况下:只有当可以快速检索值时,才应使用计算的属性。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31515805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档