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对,这是一个很好的观点。