一尘不染

有没有办法将任何通用数值转换为Double?

swift

因此,我有一个方法,其中包含3种不同类型的参数:

Int32IntDouble。因此,想法是使用泛型来最小化接口

func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) {
    guard let iCount = originalIterationCount as? Double else {return}

但是我已经意识到,是在运行时,Int32and Int参数实际上会使那失败guard let。这是有道理的,这只是我的一厢情愿。

但是,如果我尝试将a强制Numeric转换为双精度,编译器将吠叫:

func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) {
    guard let iCount = Double(originalIterationCount) else {return}

无法使用参数’(T)’调用类型’Double’的初始化程序

我认为这也是有道理的,因为没有Double的初始化程序需要Generic。

因此,看起来我将被迫编写具有不同参数类型的3种方法。在Int32Int参数的类型,将只投入Double,然后调用Double方法。这真的是最好的方法吗?我真的希望我可以Numeric以某种方式利用


阅读 286

收藏
2020-07-07

共1个答案

一尘不染

仅出于句法说明的目的,这里有一个示例,使它成为泛型并针对所有三种类型都达到Double:

func f<T:Numeric>(_ i: T) {
    var d = 0.0
    switch i {
    case let ii as Int:
        d = Double(ii)
    case let ii as Int32:
        d = Double(ii)
    case let ii as Double:
        d = ii
    default:
        fatalError("oops")
    }
    print(d)
}

但是,这是否比重载更好?在我看来,重载要好得多,因为有了泛型,我们就让一堆不需要的类型进入了门。数字合同是谎言。Double,Int和Int32的三重过载集会使编译器成为事实的源头。

2020-07-07