属性包装器初始值设定项中缺少参数“initialValue”的参数;在

问题描述 投票:0回答:2

我想创建一个属性包装器来解决众所周知的精度问题。然而,当我使用

@PropertyWrapper
时,我理解它的使用和演示here,我收到以下错误:

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")!
}
swift properties wrapper
2个回答
4
投票

根据文档

当您包含属性包装器参数时,您还可以使用赋值来指定初始值。 Swift 将赋值视为

wrappedValue
参数,并使用接受您包含的参数的初始值设定项。

因此它将您的财产声明翻译成:

var small = MantissaClamping(wrappedValue: Decimal("0.000000000001")!, 14)

显然,这与您的任何初始化程序都不匹配。

只需将参数标签重命名为

wrappedValue
:

init(wrappedValue value: Decimal, _ mantissaCount: Int) {

还将

string:
标签添加到
Decimal
初始化程序中,您错过了:

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

0
投票

回答错误消息/标题而不是问题的内容。

当我不小心将变量包含在

body
而不是
View

中时,我发现出现了此错误
struct ContentView: View {   
    var body: some View {
         @ObservedObject var model: MyModel // <<< SHOULD NOT BE IN BODY. Move up one line.

         Text("Hello world!")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.