swift - 在实现测量扩展中,我们可以使用通用的 UnitType 吗?

标签 swift generics

本质上,我想要一个关于测量的函数,将值四舍五入到一定数量的位数。我已经为 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/

相关文章:

swift - 如何将一个变量的整数与另一个变量的整数相加

Swift 将 Eureka 日期转换为 String 以进行 firebase 存储

ios - Swift:使用协议(protocol)扩展专门化方法实现

android - 我用于 Retrofit 接口(interface)创建的通用函数出现编译器错误 : inferred type is Class<T>?,但需要 Class<T!>

Java泛型抽象工厂问题

java - 具有通用方法的 Mockito

ios - 为什么内部类出现在 ProductName-Swift.h 中?我可以手动更改此文件吗?

swift - Alamofire POST 返回数据

ios - 展开可选值线程 :1 bad instruction 时意外发现 nil

c# - IEnumerable 集合声明和填充