Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift语言:如何使用观察者定义计算变量?_Swift_Variables - Fatal编程技术网

Swift语言:如何使用观察者定义计算变量?

Swift语言:如何使用观察者定义计算变量?,swift,variables,Swift,Variables,我对斯威夫特是个新手,喜欢玩语言。我已经学习了计算变量和变量观测器的概念。我想知道,当我定义一个变量时,是否可以同时定义这两个变量。我试过了,但失败了。下面是我的代码(不工作!) 我想知道,这可能吗?谢谢。我认为属性观察员只能应用于存储的属性。 计算属性和属性观察器的相似之处在于,当属性的值发生变化时,它们都会被调用,我们甚至可以将计算属性视为属性观察器 因此,我认为我们不能用observer定义一个计算变量。简而言之,这是不可能的 我认为计算属性和存储属性的概念是完全不同的 谈到存储属性,请将

我对斯威夫特是个新手,喜欢玩语言。我已经学习了计算变量和变量观测器的概念。我想知道,当我定义一个变量时,是否可以同时定义这两个变量。我试过了,但失败了。下面是我的代码(不工作!)


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

我认为属性观察员只能应用于存储的属性。 计算属性和属性观察器的相似之处在于,当属性的值发生变化时,它们都会被调用,我们甚至可以将计算属性视为属性观察器


因此,我认为我们不能用observer定义一个计算变量。

简而言之,这是不可能的

我认为计算属性和存储属性的概念是完全不同的

谈到存储属性,请将其视为成员变量,以便在设置或分配属性时了解其功能。它们是存储的而不是计算的,因此可以为它们赋值,也可以由定义类之外的其他类或方法设置或赋值

对于计算属性,每次访问时都会计算它们,因此不会存储它们。我觉得即使是设置的想法也不符合计算属性,因为如果您设置它,它不是计算的

对于属性中的setter,您知道何时设置或分配它,因此不需要willSet或didSet

var myProp: String {
    set {
        //You know it is being set here. :-)
        //No need of an event to tell you that!
    }
}

对于计算属性,观察者不会真正增加太多。很容易在集合函数中进行等效,如下所示:

set {
    // do willSet logic here
    let oldValue = a

    a = newValue + 1

    // do didSet logic here
}
如果willSet或didSet逻辑很复杂,可以将其重构为成员函数,如willSetA或didSetA

这是做不到的:

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 }
        ^

错误消息描述了原因。

Swift语言指南明确表示如下

您不需要为未重写的计算属性定义属性观察员,因为您可以在计算属性的setter中观察并响应对其值的更改。属性重写在重写中进行了描述


因此,“Set{}”-setter本身将充当观察者

以上内容不会编译-放错大括号。
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 }
        ^