首页 > 解决方案 > 有没有办法将任何通用数字转换为双精度数?

问题描述

所以我有一个方法,它有 3 种不同类型的参数可以进来:

Int32,IntDouble. 所以想法是使用泛型来最小化接口

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

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

但是,如果我尝试简单地将 aNumeric转换为双精度,编译器会咆哮:

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

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

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

所以看起来我将被迫编写 3 个具有不同参数类型的方法。和参数类型只会转换为 aInt32然后调用该方法。这真的是最好的方法吗?我真的希望我能以某种方式利用IntDoubleDoubleNumeric

标签: swiftgenerics

解决方案


...因为 Double 没有采用 Generic 的初始化程序。

这并不完全正确。没有初始化器接受Numeric参数。但是有通用的初始化器BinaryIntegerBinaryFloatingPoint参数,所以两个重载就足够了:

func resetProgressBarChunks<T: BinaryInteger>(originalIterationCount: T) {
    let iCount = Double(originalIterationCount)
    // ...
}

func resetProgressBarChunks<T: BinaryFloatingPoint>(originalIterationCount: T) {
    let iCount = Double(originalIterationCount)
    // ...
}

这包括Double, Int,Int32参数以及Float所有其他固定大小的整数类型。


推荐阅读