gpt4 book ai didi

swift - 如何将 FloatingPoint 通用类型用于 Float/Double

转载 作者:行者123 更新时间:2023-11-28 15:02:28 25 4
gpt4 key购买 nike

我想让下面的函数同时使用 Float 和 Double 值:

func srgb2linear(_ S: Float) -> Float {
if S <= 0.04045 {
return S / 12.92
} else {
return pow((S + 0.055) / 1.055, 2.4)
}
}

Swift 4 Documentation说我需要的是一个 FloatingPoint 泛型,用于表示 Float 和 Double 类,例如:

func srgb2linear<T: FloatingPoint>(_ S: T) -> T

但是当我尝试这样做时,它不会编译并出现以下错误:

Error: binary operator '<=' cannot be applied to operands of type 'T' and 'Double'
Error: binary operator '/' cannot be applied to operands of type 'T' and 'Double'
Error: binary operator '+' cannot be applied to operands of type 'T' and 'Double'

对于表示 float 的泛型,这样的运算符怎么可能没有实现呢?如果不是这样,我该如何在 Swift 中编写此函数?

最佳答案

一个问题是FloatingPoint不是 ExpressibleByFloatLiteral 的子协议(protocol),因此您的浮点文字不一定会转换为 T .您可以通过更改 FloatingPoint 来解决此问题至 BinaryFloatingPoint (这是 ExpressibleByFloatLiteral 的子协议(protocol))或通过添加 ExpressibleByFloatLiteral作为单独的要求。

然后就会遇到没有pow的问题FloatingPoint 上的通用函数, 并且没有 FloatingPoint 的成员或 BinaryFloatingPoint执行求幂。您可以通过创建新协议(protocol)并使现有浮点类型符合它来解决此问题:

protocol Exponentiatable {
func toPower(_ power: Self) -> Self
}

extension Float: Exponentiatable {
func toPower(_ power: Float) -> Float { return pow(self, power) }
}

extension Double: Exponentiatable {
func toPower(_ power: Double) -> Double { return pow(self, power) }
}

extension CGFloat: Exponentiatable {
func toPower(_ power: CGFloat) -> CGFloat { return pow(self, power) }
}

请注意,还有一个 Float80类型,但标准库不提供 pow函数。

现在我们可以编写一个可用的通用函数:

func srgb2linear<T: FloatingPoint>(_ S: T) -> T
where T: ExpressibleByFloatLiteral, T: Exponentiatable
{
if S <= 0.04045 {
return S / 12.92
} else {
return ((S + 0.055) / 1.055).toPower(2.4)
}
}

关于swift - 如何将 FloatingPoint 通用类型用于 Float/Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48759424/

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