G.A*_*sek 5 properties wrapper ios swift5.1
设想:
我想要不同类型的债券,它们具有最小值、灵活利息当前债券价值(根据某些逻辑计算)和债券增长预测。
每当债券价值超过最小值时,增长预测就会升值和贬值,反之亦然。
我正在尝试使用相同的属性包装器,以便我不会为每个键复制相同的行为:
@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
}
}
Run Code Online (Sandbox Code Playgroud)
不创建任何债券,我这样做:
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
}
}
Run Code Online (Sandbox Code Playgroud)
问题陈述: - 我无法用动态值初始化债券值。
可能的解决方法: 我将在下面的实现中使用与普通结构相同的方法。虽然文档中也指定了这种使用属性包装器的方式,但我会失去属性包装器的语法风格。
您可以编写使用属性包装器行为的代码,而无需利用特殊的属性语法。例如,这是上一代码清单中的 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)")
Run Code Online (Sandbox Code Playgroud)
任何建议都会非常有帮助。
参考来自 Swift 提案文档的Memberwise Initialisers部分,了解属性包装器:
具有属性包装器的实例属性将在成员初始化器中具有相应的参数,其类型将是原始属性类型或包装器类型,具体取决于包装器类型和初始值(如果提供)。
解决方案:
struct FoodBond {
var bondName: String
@BondValue(minimumValue: 0, flexiInterest: 0, value: 0) var bondValue = 0
init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
self.bondName = bondName
_bondValue = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |