swiftMap过滤器reduce对$0不起作用,参数swiftui

5hcedyr0  于 2023-03-07  发布在  Swift
关注(0)|答案(2)|浏览(143)

我试图从我的列表中得到一些元素的和。每个元素都有一个名为quantity的整数属性。
我的元素:

class EmbeddedElement : EmbeddedRealmObject {
    var totalPrice: Double = 0.0
    var discount: Double = 0.0
    var quantity: Int = 1
  }

我试图得到元素的总价格之和。

***myElementsList***具有唯一元素。

问题是,每当我尝试将totalPrice值乘以***$0.quantity***时,它都不会生成。

编译器无法在合理的时间内对此表达式进行类型检查;尝试将表达式分解为不同的子表达式

例如,这起作用(当乘以$0.quantity时):

Text("\((myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*$0.quantity}).reduce(0,+)), specifier: "%.2f") dollar ")

但是乘以简单数***5***或任何其他数都可以:

Text("\((myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*5}).reduce(0,+)), specifier: "%.2f") dollar ")

为什么会发生这种情况?是因为$0.quantity是一个整数值吗?我试过铸造,但没有工作。任何解决方案?

2w2cym1i

2w2cym1i1#

你在计算的第一部分乘以双精度数,计算中的所有内容都应该是双精度数。如果你把整数初始化为双精度数,它就可以工作。
双倍($0.数量)
数学在操场上用这个很好用。最好在运算符周围留出空格,因为我在上面有几个标志。

class EmbeddedElement  {
var totalPrice: Double = 5.0
var discount: Double = 3.2
var quantity: Int = 1
}

let element = EmbeddedElement()

var array = Array(repeatElement(element, count: 500))

let sum = array.map {
    ($0.totalPrice - ($0.totalPrice*$0.discount / 100)) * Double($0.quantity)
}.reduce(0,+)

在第二个calc中使用静态值5是有效的,因为它知道calc是double,结果也是double,所以它有效地将5“初始化”为double。
在处理价格和货币时,您可能需要查看Decimal类型,正如您在我的简单示例中所看到的,双精度可能导致小数位过长,需要四舍五入,这可能导致许多值之间存在微小差异。
我猜您看到的错误是模糊的,因为它相当复杂,并且类型系统正在努力提供一些有意义的东西。

z4bn682m

z4bn682m2#

我认为问题中的代码大部分是正确的。我不能保证数学公式是正确的,但代码是正确的。下面是如何排除故障
获取您的初始代码

Text("\((myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*$0.quantity}).reduce(0,+)), specifier: "%.2f") dollar ")

让我们把它分成几个部分,以便检查,删除公式,留下文本格式代码

Text("\((    ), specifier: "%.2f") dollar ")

然后这个方程

let y = myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*$0.quantity}).reduce(0,+))

啊,现在问题很明显,这个错误是我在评论中提到的用一个双精度数乘以一个整数。2修正这个方程很容易! 3把整数转换成一个双精度数,然后计算就可以工作了。

let y = myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*Double($0.quantity)}).reduce(0,+)

不要太复杂!
然后将其插回文本代码

Text("\((y), specifier: "%.2f") dollar ")

而且很管用。
注:
请看宏创的回答中关于使用货币中的双精度的评论和我的后续评论。使用Decimal128。

print(1.03 - 0.42)

产出:

0.6100000000000001     (this is inaccurate!)

反之

let a = Decimal128(floatLiteral: 1.03)
let b = Decimal128(floatLiteral: 0.42)
let c = a - b
print(c.decimalValue)

产出:

0.61  (good!)

相关问题