Ios 在Swift 5中使用动态值初始化属性包装器
场景:Ios 在Swift 5中使用动态值初始化属性包装器,ios,properties,wrapper,swift5.1,Ios,Properties,Wrapper,Swift5.1,场景: 我想要不同类型的债券,有最小的价值, 灵活利率流动债券价值(根据某些逻辑计算)和债券增长预测 债券价值 超过最小值,则增长预测变为 升值和贬值,反之亦然 我可以有多个 有自己价值观的债券 我正在尝试为相同的债券使用属性包装,这样我就不会为每个债券复制相同的行为: @propertyWrapper struct BondValue { private var bondCurrentWorth: Int private var minimumValue: Int p
@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
}
}
问题陈述:
-我无法使用动态值初始化bondvalue
可能的解决方法:
在下面的实现中,我将使用与普通结构相同的方法。虽然这种使用属性包装器的方式在文档中也有规定,但是我会放松属性包装器的语法风格。
您可以编写使用属性包装器行为的代码,
无需利用特殊属性语法。例如
下面是前面代码中列出的SmallRectangle的一个版本
而是显式地将其属性包装在无十二结构中
将@tweeverless作为一个属性
任何建议都会非常有用。请参考Swift提案文件中关于财产包装的部分:
具有属性包装的实例属性将具有
memberwise初始值设定项中的相应参数,其类型将
可以是原始属性类型,也可以是包装器类型,具体取决于
包装器类型和初始值(如果提供)
解决方案:
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)
}
}
您可以使用不带参数的属性包装,并为其指定包装值的类型,然后在init中使用参数创建它:
struct FoodBond {
var bondName: String
@BondValue var bondValue : Int
init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
self.bondName = bondName
_bondValue = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
}
}
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)
}
}
struct FoodBond {
var bondName: String
@BondValue var bondValue : Int
init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
self.bondName = bondName
_bondValue = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
}
}