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
我正在编写 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