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)
        }
    }