Core Data中Transaction的Decimal属性数组求和报错:表达式类型歧义
解决Core Data中Transaction数组Decimal属性的reduce求和问题
我之前处理Core Data数值累加时也遇到过这个报错,核心原因是Swift无法自动推断reduce操作的类型上下文——尤其是Decimal这种非基础数值类型,直接用0做初始值会让编译器摸不清你要累加的类型。
给你两种直接可用的解决方案,根据你的场景选:
1. 针对非可选的value属性
如果你的Transaction实体中value是非可选Decimal类型(Core Data里设置了“Required”),直接明确指定reduce的初始值为Decimal(0)即可:
// 假设你的Transaction数组是transactions let totalAmount = transactions.reduce(Decimal(0)) { accumulated, transaction in accumulated + transaction.value } // 更简洁的写法(Swift支持运算符作为闭包参数) let totalAmount = transactions.reduce(Decimal(0), +)
2. 针对可选的value属性
如果value是可选类型(Core Data默认是可选的),需要先处理nil值,避免编译错误或运行时崩溃:
方案A:把nil的value当作0处理
let totalAmount = transactions.reduce(Decimal(0)) { accumulated, transaction in accumulated + (transaction.value ?? Decimal(0)) }
方案B:先过滤掉value为nil的Transaction
let totalAmount = transactions .compactMap { $0.value } // 只保留非nil的value .reduce(Decimal(0), +)
额外注意:如果Core Data生成的是NSDecimalNumber
有些旧版本的Xcode或者自定义的Core Data模型,可能会把Decimal属性生成NSDecimalNumber类型,这时候需要转成Swift原生的Decimal再累加:
let totalAmount = transactions.reduce(Decimal(0)) { accumulated, transaction in accumulated + (transaction.value as Decimal) }
本质上就是给编译器一个明确的类型提示——告诉它我们要做的是Decimal类型的累加,而不是Int、Double或者其他数值类型,这样就能消除“类型歧义”的报错了。
内容的提问来源于stack exchange,提问作者Marcos Tanaka
相关产品推荐
相关产品推荐

