【问题标题】:Two way conversion using custom setters and computed struct properties使用自定义设置器和计算结构属性的两种方式转换
【发布时间】:2016-11-01 20:58:19
【问题描述】:

我创建了一个结构来涵盖基于给定比例的豆类和水之间的转换。这是我目前的定义方式

public struct Coffee {
    public var ratio:Double
    public var beans:Measurement<UnitMass>
    public var water:Measurement<UnitVolume> {
        return Measurement(value: (beans.value * ratio), unit: .milliliters)
    }
}

var cup = Coffee(ratio: 13.0, beans: Measurement(value: 30, unit: UnitMass.milligrams))
let computedWater = cup.water // 390 mL

这只能以一种方式起作用,给定或更改 bean。如何扩展结构以在更改水值时也允许计算和设置 bean?

想要的结果

cup.water = Measurement(value: 260, unit: .milliliters) // should set water and compute beans
print (cup.beans) // 20.0 mg

【问题讨论】:

    标签: ios swift foundation data-conversion units-of-measurement


    【解决方案1】:

    由于您有相互依赖的变量,因此您不能直接使用计算属性,因为您需要能够存储“其他”项的值。

    您可以使用私有后备变量来存储值并使用 setter/getter 代码来更新/检索这些值。

    您还需要实现特定的初始化程序,因为您不能再依赖自动的成员初始化程序。

    public struct Coffee {
        private var _beans: Measurement<UnitMass>!
        private var _water: Measurement<UnitVolume>!
    
        public var ratio:Double
        public var beans:Measurement<UnitMass> {
            set {
                _beans = newValue
                _water = Measurement(value: (_beans.converted(to: .milligrams).value * ratio), unit: .milliliters)
            }
            get {
                return _beans
            }
        }
    
        public var water:Measurement<UnitVolume> {
            set {
                _water = newValue
                _beans = Measurement(value: _water.converted(to: .milliliters).value * (1/ratio)), unit: .milligrams)
            }
            get {
                return _water
            }
        }
    
        init(ratio: Double, beans: Measurement<UnitMass>) {
            self.ratio = ratio
            self.beans = beans
        }
    
        init(ratio: Double, water: Measurement<UnitVolume>) {
            self.ratio = ratio
            self.water = water 
        }
    }
    
    var cup = Coffee(ratio: 13.0, beans: Measurement(value: 30, unit: UnitMass.milligrams))
    let computedWater = cup.water // 390 mL
    print (cup.water)
    
    cup.water = Measurement(value: 260, unit: .milliliters) // should set water and compute beans
    print (cup.beans) // 20.0 mg
    cup.water = Measurement(value: 0.26, unit: .liters)
    print (cup.beans) // 20.0 mg
    

    请注意,我还修改了您的公式,以确保使用正确的单位。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2013-01-25
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多