设想:
我想拥有不同类型的债券,它们具有最小值、灵活利息当前债券价值(根据一些逻辑计算)和债券增长预测。
每当债券价值超过最小值时,增长预测就会升值,反之亦然。
- 我可以拥有多个具有自己价值观的债券。
我正在尝试使用相同的属性包装器,这样我就不会为每个键复制相同的行为:
@propertyWrapper
struct BondValue {
private var bondCurrentWorth: Int
private var minimumValue: Int
private var flexiInterest: Int
var projectedValue: BondGrowth = .appreciating // The projected value projects the growth for the bond
var wrappedValue: Int {
get {
return bondCurrentWorth
}
set {
bondCurrentWorth = newValue + (newValue * flexiInterest/100)
projectedValue = bondCurrentWorth < minimumValue ? .depriciating : .appreciating
}
}
init(wrappedValue: Int = 0, minimumValue: Int, flexiInterest: Int, value: Int) {
self.minimumValue = minimumValue
self.flexiInterest = flexiInterest
self.bondCurrentWorth = value
}
}
不,为了建立任何联系,我这样做:
struct FoodBond {
var bondName: String
@BondValue(minimumValue: 200, flexiInterest: 30, value: 200) var value = 30
init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
self.bondName = bondName
}
}
问题陈述: - 我无法用动态值初始化债券值。
可能的解决方法: 我会在下面的实现中使用与普通结构相同的方法。虽然在文档中也指定了这种使用属性包装器的方式,但我会放弃属性包装器的语法风格。
您可以编写使用属性包装器行为的代码,而无需利用特殊的属性语法。例如,这是前面代码清单中 SmallRectangle 的一个版本,它显式地将其属性包装在 TwelveOrLess 结构中,而不是将 @TwelveOrLess 写为属性
@propertyWrapper
struct BondValue {
private (set) var bondCurrentWorth: Int
private (set) var minimumValue: Int
private (set) var flexiInterest: Int
var projectedValue: BondGrowth = .appreciating // The projected value projects the growth for the bond
var wrappedValue: Int { .... }
init(wrappedValue: Int = 0, minimumValue: Int, flexiInterest: Int, value: Int) { ... }
}
struct FoodBond {
var bondName: String
var value = BondValue(minimumValue: 0, flexiInterest: 0, value: 0) // Provide a default value
init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
self.bondName = bondName
self.value = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
}
}
var foodBond = FoodBond(bondName: "Food Bond", minimumValue: 200, flexiInterest: 10, value: 200)
print("Initial bond current worth - \(foodBond.value.bondCurrentWorth)")
print("Bond growth - \(foodBond.value.projectedValue)")
任何建议都会非常有帮助。