我知道一个是一个二传手,另一个是财产观察者.我的问题是他们的行为有何不同,你何时会使用另一个.他们不是做同样的事情吗?例如:
var foo: String {
set {
run code when set
}
}
var foo: String {
didSet {
run code when set
}
}
Run Code Online (Sandbox Code Playgroud)
Ant*_*ito 15
他们并没有做同样的事情,相反他们有完全不同的目的.的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
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,变量number不是传统意义上的变量,而是计算属性.所以,当我打电话时,s.number我得到了x和y的乘积.此外,您将使用该集来更改结构中的其他变量(不是计算属性本身).所以,我设置x和y基于的不同的值newValue.这个计算属性的概念可以用来代替函数,我发现在简化从函数中检索数据方面非常有用.例如,你可以拥有一个以千米为单位的距离的结构,你可能会非常频繁地想要以英里为单位.因此,您可以miles为里程数创建一个计算属性,用于计算公里数get 方法,如果您在程序中设置里程,则使用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
Run Code Online (Sandbox Code Playgroud)
注意didSet它实际上是如何包含一个值的变量,也就是说,它不是一个计算属性.此外,我使用计算属性average来获得平均值.总的来说,我希望我能清除你对Swift非常强大的方面的困惑.
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |