让我们从代码片段开始: 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 { //
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)
以下是我对存储和计算属性的一些个人理解:
a:只有观察者(willSet和didSet)的属性不是计算属性,而是存储属性(例如上面代码中的proA属性).
b:计算属性必须没有初始化(参见上面代码的注释).
c:setter等于属性观察者,属性观察者只是变异前后观察者的设置者.
问题:
我想知道是什么使一个属性成为计算属性?是否正确,只要该属性具有getter并返回它是一个计算属性?
2.我的所有理解(a,b& c)是否正确?如果没有,你会很高兴指出.
3.为什么不允许初始化计算属性? (请参见下图)当我这样做时,编译器发出警告不能调用非函数类型的值“int”这个错误的含义是什么?
非常感谢.
首先,这是关于变量,而不是属性.任何变量都可以是计算变量.属性只是使用变量的一种方法.我认为总的来说,在将存储变量与setter观察者并排放置计算变量时,你犯了一个大错误.他们是无关的!
将计算变量看作是在使用它时看起来和行为类似的变量 – 你得到并且(可能)设置它 – 但实际上是一个函数(或一对函数).它只是一种调用函数的紧凑方式.这就是全部.
另一方面,带有观察者的存储变量只是一个存储的变量,它也有一些观察者.
好的,关于你的问题:
- I wonder what makes a property a computed property? Is is correct that as long as the property has a getter and return it is a computed property?
是.它是一个计算变量,因为您使用使其成为计算变量的语法(使用花括号)声明它.
- Are all my understandings (a, b & c) correct? If not would be nice of you to point out
是.我认为你的“c”非常有洞察力:计算变量不需要setter观察者,因为它有(喘气!)一个setter!
- Why is it not allowed to initialize an computed property? (Please see the figure below) And when I do so the compiler gives out the warning Cannot call value of none-function type “int” What’s the meaning of this error?
没有任何意义,计算变量“有”一个值 – 它被计算!这只是一些功能! – 所以给它分配一个“初始”值是没有意义的.