Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 set和didSet的根本区别是什么?_Swift - Fatal编程技术网

Swift set和didSet的根本区别是什么?

Swift set和didSet的根本区别是什么?,swift,Swift,我知道一个是设置者,另一个是属性观察者。我的问题是,它们在行为上有什么不同,什么时候你会使用其中一种而不是另一种。他们不是做了几乎相同的事情吗?例如: var foo: String { set { run code when set } } var foo: String { didSet { run code when set } } 他们做的事情并不完全相同,相反,他们有完全不同的目的。get和set用于计算属性。例如,以这个没有实际用途的示例结构为例,它是一个很好的

我知道一个是设置者,另一个是属性观察者。我的问题是,它们在行为上有什么不同,什么时候你会使用其中一种而不是另一种。他们不是做了几乎相同的事情吗?例如:

var foo: String {
 set {
   run code when set
 }
}

var foo: String {
 didSet {
  run code when set
 }
}

他们做的事情并不完全相同,相反,他们有完全不同的目的。
get
set
用于计算属性。例如,以这个没有实际用途的示例结构为例,它是一个很好的演示

struct test {
    var x = 5
    var y = 5
    var number: Int {
        get {
            return x * y
        }
        set (newValue){
            x = newValue / 2
            y = newValue / 2
        }
    }
}

var s = test()
s.number //25
s.number = 100
s.x //50
s.number //2500
因此,正如您所看到的,变量
number
不是传统意义上的变量,而是一个计算属性。所以,当我调用
s.number
时,我得到x和y的乘积。此外,还可以使用该集合更改结构中的其他变量(而不是计算属性本身)。因此,我根据
newValue
x
y
设置为不同的值。这种计算属性的思想可以用来代替函数,我发现它在简化从函数中检索数据方面非常有用。例如,你可以有一个以公里为单位的结构,你可能经常想要以英里为单位。因此,您可以使用
get
方法为英里创建一个计算属性
miles
,用于计算公里数,如果您在程序中将miles设置为,则可以使用setter更改公里数


现在,对于
didSet
willSet
。您可以使用这些通知结构值的更改。例如,averageTracker

struct averageTracker {
    var total: Double = 0 {
        didSet {
            numEntries++
        }
    }
    var numEntries: Double = 0
    var average: Double {
        get {
            return total / numEntries
        }
    }
}


var ave = averageTracker()
ave.total += 10
ave.total += 20
ave.average //15
请注意,
didSet
实际上是在一个包含值的变量上,也就是说,它不是一个计算属性。此外,我还使用了一个计算属性
average
来获得平均值。总的来说,我希望我澄清了您对Swift这一非常强大的方面的困惑。

还有一件事。:)

初始化值时,set{}正在调用,但不是disSet{}

var x : Int = 0 {
  set {
    print(x)
  }
}
...
x = 1
产生“0”和“1”输出

但事实并非如此

var x : Int = 0 {
  didSet {
    print(x)
  }
}
...
x = 1
在更改值之前未调用。 只打印“1”结果,而不打印“0”和“1”

它可以作为有用的,所以bug源