我试图编写一些使用泛型在 Double 和 Decimal 之间切换的代码,并使用 Decimal 中的所有“符合”关系设置这个简单的示例,这是 Double 中列出的关系的子集:
func generic_calc_1<T: Comparable & CustomStringConvertible & Decodable & Encodable & ExpressibleByFloatLiteral & ExpressibleByIntegerLiteral & Hashable & Plottable & Sendable & SignedNumeric & Strideable>(a: T, b: T) -> T
{
return (a + b) * (b - a)
}
print("Calc1: Double:", generic_calc_1(a: Double(2), b: Double(3)))
print("Calc1: Decimal:", generic_calc_1(a: Decimal(2), b: Decimal(3)))
这很好,但是当我使用除法运算符时,我收到错误:
func generic_calc_2<T: Comparable & CustomStringConvertible & Decodable & Encodable & ExpressibleByFloatLiteral & ExpressibleByIntegerLiteral & Hashable & Plottable & Sendable & SignedNumeric & Strideable>(a: T, b: T) -> T
{
return a / b //error: binary operator '/' cannot be applied to two 'T' operands
}
这看起来真的很奇怪,感觉像是一个错误。但我想这可能有原因吗?我无法想象是什么。我想有一些方法可以解决这个问题,但看起来这应该是开箱即用的。我在这里错过了什么吗?
根本问题是 Decimal 不符合 FloatingPoint。这是因为,虽然从理论上讲,FloatingPoint 并不意味着 BinaryFloatingPoint,但实际上却意味着。而 Decimal 不(也不能)符合 BinaryFloatingPoint。
正如您所说,Decimal 具有 Double 协议的子集,但这些协议都不包括
/
(来自 FloatingPoint)。
因此,尝试将 Decimal 桥接到其他类型总是很尴尬,并且需要您选择如何处理它。