【问题标题】:Swift: Casting a FloatingPoint conforming value to DoubleSwift:将符合 FloatingPoint 的值转换为 Double
【发布时间】:2020-03-20 11:24:33
【问题描述】:

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

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

我不想说出我想要达到的目标,这样我们就可以专注于上述问题。我更愿意听到这种方式是不可能的,而不是为我要解决的更大问题获得有效的解决方法。

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

【问题讨论】:

  • 你是对的。我需要编辑这个问题。

标签: swift floating-point double


【解决方案1】:

问题是你需要扩展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

您还可以创建泛型方法来返回符合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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多