Swift - 保持两个属性同步



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

最新更新