Swift 缺少参数'的参数;初始值';属性包装初始值设定项中;添加';wrappedValue';和';初始值';争论

Swift 缺少参数'的参数;初始值';属性包装初始值设定项中;添加';wrappedValue';和';初始值';争论,swift,properties,wrapper,Swift,Properties,Wrapper,我想创建一个属性包装器来适应众所周知的精度问题。但是,当我使用@PropertyWrapper时,我发现以下错误: Extra argument in call Missing argument for parameter 'initialValue' in property wrapper initializer; add 'wrappedValue' and 'initialValue' arguments in '@MantissaClamping(...)' 我不知道我怎么会有一个“调

我想创建一个属性包装器来适应众所周知的精度问题。但是,当我使用
@PropertyWrapper
时,我发现以下错误:

Extra argument in call
Missing argument for parameter 'initialValue' in property wrapper initializer; add 'wrappedValue' and 'initialValue' arguments in '@MantissaClamping(...)'
我不知道我怎么会有一个“调用中的额外参数”,我指定十进制作为包装值,并提供整数文本作为尾数参数

在说我有一个额外的参数后,另一个错误说我缺少一个参数。建议我把它们作为参数添加到属性包装器中……在我看来,这会破坏属性包装器的全部用途,因为它需要像这样的冗余代码……但即使这样也不行

struct MantissaClampTestStruct {
    @MantissaClamping(Decimal("0.000000000001")!, 14) var small: Decimal = Decimal("0.000000000001")!
}
如何将文字值分配给属性,并将其应用于属性包装器?在提供直接应用于属性包装器的int值时

这是我的可复制代码,你可以放在操场上

extension Decimal {
    /// Rounds a value
    /// - Parameters:
    ///   - roundingMode: up down plain or bankers
    ///   - scale: the number of digits result can have after its decimal point
    /// - Returns: the rounded number
    func rounded(_ roundingMode: NSDecimalNumber.RoundingMode = .bankers, scale: Int = 0) -> Self {
        var result = Self()
        var number = self
        NSDecimalRound(&result, &number, scale, roundingMode)
        return result
    }
}

@propertyWrapper
struct MantissaClamping {
    var value: Decimal
    let mantissaCount: Int
    
    init(initialValue value: Decimal, _ mantissaCount: Int) {
        precondition(mantissaCount < 19 && mantissaCount >= 0)
        self.value = value
        self.mantissaCount = mantissaCount
    }
    
    var wrappedValue: Decimal {
        get { value }
        set { value = newValue.rounded(.down, scale: mantissaCount)}
    }
}

struct MantissaClampTestStruct {
    @MantissaClamping(14) var small: Decimal = Decimal("0.000000000001")!
}
扩展十进制{ ///舍入一个值 ///-参数: ///-四舍五入模式:上下平原或平原 ///-刻度:小数点后结果的位数 ///-返回:四舍五入的数字 func舍入(uRoundingMode:NSDecimalNumber.roundingMode=.bankers,scale:Int=0)->Self{ var result=Self() var编号=自 NSDecimalRound(&结果,&数字,比例,取整模式) 返回结果 } } @房地产经纪人 结构尾数抽样{ 变量值:十进制 让尾数计算:Int 初始值(初始值:十进制,uu尾数:Int){ 前提条件(尾数<19&&尾数>=0) 自我价值=价值 self.尾数=尾数 } var wrappedValue:十进制{ 获取{value} set{value=newValue.rounded(.down,scale:尾数)} } } 结构尾数示例测试结构{ @尾数取样(14)变量小:十进制=十进制(“0.000000000001”)! } 根据以下内容:

当包含属性包装参数时,还可以使用赋值指定初始值。Swift将赋值视为
wrappedValue
参数,并使用接受所包含参数的初始值设定项

因此,它将您的属性声明转换为如下内容:

var small = MantissaClamping(wrappedValue: Decimal("0.000000000001")!, 14)
显然,这与您的任何初始值设定项都不匹配

只需将参数标签重命名为
wrappedValue

init(wrappedValue value: Decimal, _ mantissaCount: Int) {
并将
字符串:
标签添加到
十进制
初始值设定器中,这是您遗漏的:

@MantissaClamping(14) var small: Decimal = Decimal(string: "0.000000000001")!
您可能还希望对初始值进行四舍五入:

init(wrappedValue value: Decimal, _ mantissaCount: Int) {
    precondition(mantissaCount < 19 && mantissaCount >= 0)

    // here
    self.value = value.rounded(.down, scale: mantissaCount)
    self.mantissaCount = mantissaCount
}
init(wrappedValue值:十进制,uu尾数:Int){
前提条件(尾数<19&&尾数>=0)
//这里
self.value=value.rounded(.down,scale:尾数)
self.尾数=尾数
}

这解决了错误,但setter无法获得called@LeoDabus嗯?刚试过,二传手就被叫来了。我在setter中放置了一个
print
,并执行了
var s=mantissalampteststruct();s、 小=1
。消息已打印。我的坏消息是初始化结构时未调用它。OP需要将其更改为
self.value=value.rounded(.down,scale:尾数)
。这不是这里要问的问题,但应该提到well@LeoDabus对,这是一个很好的观点。