Swift语言:如何使用observer定义计算变量?

时间:2015-03-30 12:22:50

标签: swift variables

我是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)

我想知道,这可能吗?感谢。

5 个答案:

答案 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本身将充当观察者。