2016-01-23 88 views
2

在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()程序的转换代码...

回答

1

你可以使用这两个中的一个的计算属性,比方说度数。这将减少锅炉板代码,而不会失去结构的功能。

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

如果你不想每次都做了计算,你可以声明这两个属性的动态,并有回他们店:

struct Angle { 
    private var _degrees: Double = 0.0 
    var degrees: Double { 
     get { return _degrees } 
     set { _degrees = newValue; _radians = (newValue/360) * 2 * M_PI } 
    } 

    private var _radians: Double = 0.0 
    var radians: Double { 
     get { return _radians } 
     set { _radians = newValue; _degrees = radians/(2 * M_PI) * 360 } 
    } 

    init(inDegrees degrees: Double) { 
     self.degrees = degrees 
    } 
    init(inRadians radians: Double) { 
     self.radians = radians 
    } 
} 
+0

谢谢 - 是的,我最初有它这样的,但我真的希望在每次读取度数值时避免不必要的重新计算,因为在实际情况下,这是一项相当繁重的工作:( –

+0

@MartinCR我更新了我的答案并提供了解决方案 – Cristik

+0

啊 - 现在这是对我来说是新的语言的一个功能!+1给你:) –