在 Swift 中,我有两个相关的结构属性,我想保持同步。
我目前正在与财产观察者一起这样做,但我不得不添加一个额外的标志,以防止他们互相玩无限的乒乓球游戏。
有没有更优雅和/或更透明的方式来实现这一目标?
一个简化的示例:
import Foundation
struct Angle {
var blockPropertyObservers = false
var degrees: Double {
willSet(degrees) {
print("will set degrees to (degrees)")
if !blockPropertyObservers {
blockPropertyObservers = true
radians = (degrees / 360) * 2 * M_PI
} else {
blockPropertyObservers = false
}
}
}
var radians: Double {
willSet(radians) {
print("will set radians to (radians)")
if !blockPropertyObservers {
blockPropertyObservers = true
degrees = (radians / (2 * M_PI)) * 360
} else {
blockPropertyObservers = false
}
}
}
init(inDegrees degrees: Double) {
self.degrees = degrees
self.radians = (degrees / 360) * 2 * M_PI
}
init(inRadians radians: Double) {
self.radians = radians
self.degrees = (radians / (2 * M_PI)) * 360
}
}
理想情况下,我还想找到一种方法来避免在init()
例程中复制转换代码......
您可以对这两个属性之一使用计算属性,比如说度数。这将减少样板代码,而不会丢失结构的功能。
struct Angle {
var degrees: Double {
get { return radians / (2 * M_PI) * 360 }
set { radians = (newValue / 360) * 2 * M_PI}
}
var radians: Double = 0.0
init(inDegrees degrees: Double) {
self.degrees = degrees
}
init(inRadians radians: Double) {
self.radians = radians
}
}