【问题标题】:FloatingPoint extension - init with other FloatingPoint typeFloatingPoint 扩展 - 与其他 FloatingPoint 类型一起初始化
【发布时间】:2018-09-07 19:59:13
【问题描述】:

我需要为任何FloatingPoint 值编写一个初始化器,它可以采用其他类型的FloatingPoint,并将其转换为Self。这在swift 中可行吗?我尝试过这样的事情:

init<FloatingPointType: FloatingPoint>(_ value: FloatingPointType) {
    guard let sameValue = value as? Self else {
        // Pass throu double to get best precision
        self.init(Double(value))
        return
    }
    self = sameValue // The same type
}

但这只会造成无限循环。问题在于创建新的自我,没有初始化器可以接受任何其他FloatingPoint。我认为这可能是不可能的,但也许有一些方法可以实现这一点。

【问题讨论】:

  • 您的意思是要将任何 Float、Double 和 Float80 转换为 Float?
  • 我需要一个函数或初始化程序,它允许我将任何 FloatingPoint(如 Float、Double 等)转换为任何其他 FloatingPoint 类型。我需要这是通用的。所以例如我可以这样做: let a = Double(3);让 b = Float(a)
  • "获得最佳精度" -> Float80。 Double 仅适用于 64。浮动在 32 上。
  • let a = Double(3); let b = Float(a) 已经可以了!
  • 你的问题没有任何意义。看起来您很难扩展 FloatingPoint 协议以尝试返回 FloatingPoint 对象。你不能。您需要返回Self,它可以是任何符合FloatingPoint 协议的类型,例如DoubleFloatFloat80

标签: swift generics type-conversion


【解决方案1】:

标准库中已经存在这样的初始化器:

let a: Double = Double(3.625)

//From Double to Float and Float80
let b: Float = Float(a)
let c: Float80 = Float80(a)

//From Float to Double and Float80
let d: Double = Double(b)
let e: Float80 = Float80(b)

//From Float80 to Double and Float
let f: Double = Double(c)
let g: Float = Float(c)

你可以找对了here:

public init<Source : BinaryFloatingPoint>(_ value: Source) {
    self = Self._convert(from: value).value
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多