gpt4 book ai didi

swift - 为什么 Float 到 Double 的转换在运行时失败?

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:29 25 4
gpt4 key购买 nike

我有以下代码:

func roughlyEq<T: FloatingPoint>(_ a: T, _ b: T) -> Bool {
return abs(a - b) < (0.01 as! T)
}

当我使用 Float 类型的参数调用它时,我在运行时崩溃了:

Could not cast value of type 'Swift.Double' (0x10043e6a8) to 'Swift.Float' (0x10043e5e0)

这没有任何意义——0.01 确实可以转换为 Float,比如说当我写 Float(0.01) 时。为什么会出现此错误?

相反的方向也失败了:

Could not cast value of type 'Swift.Float' (0x1004ea5e0) to 'Swift.Double' (0x1004ea6a8).

如何让这个方法起作用?

最佳答案

正如 Alexander 已经说过的,你不能从 Double 中强行转换到 float 。文字常量 0.01 在您的代码中具有类型 Double函数,并将 转换为!如果 TFloat

,则 T 失败

一个简单的解决方案是为 BinaryFloatingPoint 定义函数相反,它描述了“二进制浮点类型”并扩展了 FloatingPoint 协议(protocol)。所有常见的浮点类型(FloatDoubleCGFloat) 符合 BinaryFloatingPoint。由于 BinaryFloatingPoint 也继承自ExpressibleByFloatLiteral,您现在可以与0.01 文字:

func roughlyEq<T: BinaryFloatingPoint>(_ a: T, _ b: T) -> Bool {
return abs(a - b) < 0.01
}

此处 0.01 的类型从上下文中推断为 T

或者作为协议(protocol)扩展方法:

extension BinaryFloatingPoint {
func roughlyEq(_ other: Self) -> Bool {
return abs(self - other) < 0.01
}
}

关于swift - 为什么 Float 到 Double 的转换在运行时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43714453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com