我想创建一个属性包装器来解决众所周知的精度问题。然而,当我使用
@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 将赋值视为
参数,并使用接受您包含的参数的初始值设定项。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
}
回答错误消息/标题而不是问题的内容。
当我不小心将变量包含在
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!")
}
}