Swift:将符合 FloatingPoint 的值转换为 Double

Swift: Casting a FloatingPoint conforming value to Double

我正在编写 FloatingPoint 协议的扩展。我想以任何可能的方式将它转换为 Double。

extension FloatingPoint {
    var toDouble: Double {
        return Double(exactly: self) ?? 0 //compile error
    }
}

我不想说出我想要实现的目标,这样我们就可以专注于上述问题。我宁愿听到以这种方式不可能做到这一点,也不愿收到针对我试图解决的更大问题的有效解决方法。

我尝试使用不同的 Double 构造函数,但也许我尝试的不够努力。

问题是您需要扩展 BinaryFloatingPoint 而不是 FloatingPoint 协议:

extension BinaryFloatingPoint {
    // Creates a new instance from the given value if possible otherwise returns nil
    var double: Double? { Double(exactly: self) }
    // Creates a new instance from the given value, rounded to the closest possible representation.
    var doubleValue: Double { .init(self) }
}

游乐场测试

let cgFloat: CGFloat = .pi                    // 3.141592653589793

let exactlyDouble = cgFloat.double            // 3.141592653589793
let closestDoubleValue = cgFloat.doubleValue  // 3.141592653589793

您还可以为 return 任何符合 BinaryFloatingPoint 协议的浮点类型创建泛型方法:

extension BinaryFloatingPoint {
    func floatingPoint<F: BinaryFloatingPoint>() -> F? { F(exactly: self) }
    func floatingPointValue<F: BinaryFloatingPoint>() -> F { .init(self) }
}

游乐场测试

let float80pi: Float80 = .pi   // 3.1415926535897932385

let closestCGFloatPiValue: CGFloat = float80pi.floatingPointValue()  // 3.141592653589793
let closestDoublePiValue: Double = float80pi.floatingPointValue()    // 3.141592653589793
let closestFloatPiValue: Float = float80pi.floatingPointValue()      // 3.141593

let exactlyCGFloat: CGFloat? = float80pi.floatingPoint()  // nil
let exactlyDouble: Double? = float80pi.floatingPoint()  // nil
let exactlyFloat: Float? = float80pi.floatingPoint()    // nil