swift - 有没有办法将任何通用数字转换为双精度数?
问题描述
所以我有一个方法,它有 3 种不同类型的参数可以进来:
Int32
,Int
和Double
. 所以想法是使用泛型来最小化接口
func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) {
guard let iCount = originalIterationCount as? Double else {return}
但是我已经意识到,在运行时,Int32
andInt
参数实际上会失败guard let
。这是有道理的,这只是我的一厢情愿。
但是,如果我尝试简单地将 aNumeric
转换为双精度,编译器会咆哮:
func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) {
guard let iCount = Double(originalIterationCount) else {return}
无法使用“(T)”类型的参数调用“Double”类型的初始化程序
我认为这也是有道理的,因为 Double 没有采用 Generic 的初始化程序。
所以看起来我将被迫编写 3 个具有不同参数类型的方法。和参数类型只会转换为 aInt32
然后调用该方法。这真的是最好的方法吗?我真的希望我能以某种方式利用Int
Double
Double
Numeric
解决方案
...因为 Double 没有采用 Generic 的初始化程序。
这并不完全正确。没有初始化器接受Numeric
参数。但是有通用的初始化器BinaryInteger
和BinaryFloatingPoint
参数,所以两个重载就足够了:
func resetProgressBarChunks<T: BinaryInteger>(originalIterationCount: T) {
let iCount = Double(originalIterationCount)
// ...
}
func resetProgressBarChunks<T: BinaryFloatingPoint>(originalIterationCount: T) {
let iCount = Double(originalIterationCount)
// ...
}
这包括Double
, Int
,Int32
参数以及Float
所有其他固定大小的整数类型。
推荐阅读
- r - 在 ggplot 中,如何使用 data.frame 中的值参数化多个曲线/函数并将它们绘制在不同的方面?
- c# - 编辑另一个长度不同的数组C#
- c++ - 具体来说,标准规定修改 const 对象是未定义的行为吗?
- tf-idf - 有人可以检查我的 tf-idf 加权是否正确吗?
- terraform - 如何在 terraform cloud 中从 git 加载文件?
- objective-c - 在视图控制器之间快速导航
- python - 从与另一个数据帧重叠的数据帧中删除行
- sql - 识别安装后对 SQL 数据库结构的更改
- mysql - MySQL:用单个查询在整个表中用实际 NULL 值替换“NULL”作为字符串
- asp.net - 如何在 ASP.NET Core MVC Web 应用程序项目中本地化数据库中的数据