Swift:将符合FloatingPoint的值转换为Double [英] Swift: Casting a FloatingPoint conforming value to Double

查看:45
本文介绍了Swift:将符合FloatingPoint的值转换为Double的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm writing an extension to a FloatingPoint protocol. I want to cast it to a Double in any possible way.

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

我不想告诉我要达到的目标,因此我们可以专注于上述问题.我更希望听到这样的方法是不可能的,而不是为了解决我要解决的更大问题而没有有效的解决方法.

I'd prefer not to tell what I'm trying to achieve so we can focus just on above problem. I'd prefer to hear that's impossible to do it this way instead of receiving a valid workaround for the bigger problem I'm trying to solve.

我尝试使用其他Double构造函数,但也许我没有尽力.

I tried to use different Double constructors but maybe I wasn't trying hard enough.

推荐答案

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

The problem there is that you need to extend BinaryFloatingPoint instead of FloatingPoint protocol:

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 协议的任何浮点类型:

You can also create generic methods to return any floating point type that conforms to the BinaryFloatingPoint protocol:

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

这篇关于Swift:将符合FloatingPoint的值转换为Double的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆