gpt4 book ai didi

ios - 使用自定义 setter 和计算结构属性的两种方式转换

转载 作者:行者123 更新时间:2023-11-30 13:17:03 25 4
gpt4 key购买 nike

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

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

最佳答案

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

您可以使用私有(private)支持变量来存储值,并使用 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

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

关于ios - 使用自定义 setter 和计算结构属性的两种方式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38111665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com