什么使属性成为 Swift 中的计算属性

SLN*_*SLN 6 properties swift computed-properties property-observer

让我们从代码片段开始:

St Foo {
    var proA: Int = 0 { // needs initialization
        willSet {
            print("about to set proA to \(newValue) from \(proA)")
        }
        didSet {
            print("already set proA to \(proA) from \(oldValue)")
        }
    }

    var ProB: Int { // do not needs initialization 
        return 1
    }
}

let foo = Foo()
foo.proA = 23
print(foo.ProB)
Run Code Online (Sandbox Code Playgroud)

以下是我个人对存储和计算属性的一些理解:

a:只有观察者的属性(willSet 和 didSet)不是计算属性而是存储属性(例如上面代码中的proA属性)。

b:计算属性不能有初始化(见上面代码的注释)。

c: setter 相当于属性观察者,属性观察者只是变异前后的 setter + 观察者。

问题:

1.我想知道是什么使属性成为计算属性?只要该属性有一个 getter 并返回它就是一个计算属性,这是否正确?

2.我的所有理解(a, b & c)都正确吗?如果没有,请您指出来。

3.为什么不允许初始化计算属性?(请参见下图)当我这样做时,编译器发出警告无法调用非函数类型“int”的值此错误的含义是什么?

在此处输入图片说明

非常感谢。

mat*_*att 4

首先,这是关于变量,而不是属性任何变量都可以是计算变量。属性只是使用变量的一种方式。

\n\n

我认为总的来说,将存储变量与设置器观察者与计算变量并排放置是一个很大的错误。他们是没有血缘关系的!

\n\n

将计算变量视为看起来和行为都像变量的东西,当您使用它时,您会得到并(也许)将其设置为 \xe2\x80\x94 但实际上是一个函数(或一对函数) )。它只是调用函数的一种紧凑方式。就这样而已。

\n\n

另一方面,具有观察者的存储变量只是一个也具有一些观察者的存储变量。

\n\n
\n\n

好的,回答你的问题:

\n\n
\n
    \n
  1. 我想知道是什么使属性成为计算属性?只要属性有 getter 并返回它就是计算属性,这是正确的吗?
  2. \n
\n
\n\n

是的。它是一个计算变量,因为您使用使其成为计算变量的语法(带有花括号)声明它。

\n\n
\n
    \n
  1. 我所有的理解(a、b、c)都正确吗?如果没有,请您指出
  2. \n
\n
\n\n

是的。我认为你的“c”很有洞察力:计算变量不需要设置观察者,因为它有(喘息!)设置器!

\n\n
\n
    \n
  1. 为什么不允许初始化计算属性?(请参见下图)当我这样做时,编译器会发出警告 Cannot call value of none-function type "int" 这个错误的含义是什么?
  2. \n
\n
\n\n

计算变量“具有”值 \xe2\x80\x94 是没有意义的!这只是一些功能!\xe2\x80\x94 因此为其分配“初始”值是没有意义的。

\n