我是Swift的新手并且使用该语言。我已经学会了计算变量和变量观察者的概念。我想知道在定义变量时是否可以同时定义它们。我试过但失败了。下面是我的代码(不工作!)。
var a:Int = 88
{
get
{
println("get...")
return 77
}
set
{
a = newValue + 1
}
}
{
willSet
{
println("In willSet")
println("Will set a to \(newValue)")
println("Out willSet")
}
didSet
{
println("In didSet")
println("Old value of a is \(oldValue)")
println(a)
if(a % 2 != 0)
{
a++
}
println("Out didSet")
}
}
println(a)
a = 99
println(a)
我想知道,这可能吗?感谢。
答案 0 :(得分:7)
简短的回答,这是不可能的。
我认为计算属性和存储属性的想法非常独特。
谈论存储的属性,将其视为具有功能的成员变量,以了解它们何时被设置或分配。它们的存储不是计算的,因此它们可以被赋值,并且可以由定义类之外的其他类或方法设置或分配。
如果是计算属性,则每次访问它们时都会计算它们,因此不会存储它们。我觉得甚至设置的想法也不符合计算属性,因为如果你设置它不计算。
如果属性中有setter,则知道何时设置或分配,因此不需要willSet或didSet。
var myProp: String {
set {
//You know it is being set here. :-)
//No need of an event to tell you that!
}
}
答案 1 :(得分:3)
无法完成:
Welcome to Swift version 1.2. Type :help for assistance.
1> class Foo {
2. var bar : Int {
3. get { return 1 }
4. willSet { println ("will") }
5. }
6. }
repl.swift:3:9: error: willSet variable may not also have a get specifier
get { return 1 }
^
错误消息描述了原因。
答案 2 :(得分:2)
对于计算属性,观察者实际上不会添加太多。在set函数中很容易做到等效:
set {
// do willSet logic here
let oldValue = a
a = newValue + 1
// do didSet logic here
}
如果willSet或didSet逻辑很复杂,您可以将其重构为成员函数,例如willSetA或didSetA。
答案 3 :(得分:1)
我认为属性观察者只能应用于存储的属性。 计算属性和属性观察者在某种意义上是相似的,它们在属性值发生变化时被调用,我们甚至可以将计算属性视为属性观察者
所以,我认为我们不能用observer定义一个计算变量。
答案 4 :(得分:0)
Swift语言指南已清楚表达如下......
“您不需要为非重写的计算属性定义属性观察器,因为您可以在计算属性的setter中观察并响应其值的更改。在Overriding中描述了属性覆盖。”
所以“Set {}” - setter本身将充当观察者。