本质上,我想要一个关于测量的函数,将值四舍五入到一定数量的位数。我已经为 Double 编写了该函数,因此我尝试使用此方法进行测量:
extension Measurement {
func roundToPlace<T>(_ place: Int) -> Measurement<T> {
return Measurement(value: self.value.roundToPlace(place), unit: self.unit)
}
}
extension Double {
func roundToPlace(_ place: Int) -> Double {
let rounder = Double(truncating: pow(10, place) as NSNumber)
return (Double(Int(self * rounder)) / rounder)
}
}
我希望这适用于所有 UnitType,因为 UnitType 没有发生任何更改。我认为将 UnitType 设置为 Generic 可以让我简单地将其传递回来,但编译器抛出以下错误:
Cannot convert return expression of type 'Measurement<UnitType>' to return type 'Measurement<T>'
有什么想法吗?
最佳答案
我对您的 roundToPlace
函数有些怀疑。由于二进制舍入,大多数实现这一点的尝试都不会达到大多数人的意思。但可以四舍五入为“最接近十次方的二次方”,所以也许这就是您的意思。 (我自己构建了它,这很好。当人们认为可以打印出值并且最后不会有 ...0000000004 时,它只会让人们感到不舒服:D)
对于您的实际问题,您的代码允许调用者决定 UnitType 是什么,并且您 promise 返回该类型,无论现有的 UnitType 是什么。那不是你的意思。您的意思是“返回与当前测量相同的类型”。这根本不通用。它只是返回 Self
(这是 self
的类型)。
extension Measurement {
func roundToPlace(_ place: Int) -> Self {
return Self(value: self.value.roundToPlace(place), unit: self.unit)
}
}
关于swift - 在实现测量扩展中,我们可以使用通用的 UnitType 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65373320/