为什么让x作为Float案例在Any变量的开关中不匹配?

Die*_*ich 9 swift swift3

我有一个标记值的枚举(这是来自玩具Scheme解释器项目),如下所示:

enum Value {
  case int(Int)
  case float(Float)
  case bool(Bool)
  ...
}
Run Code Online (Sandbox Code Playgroud)

我为它写了一个初始化器:

init?(value:Any) {
  switch v {
    case let v as Int: self = .int(v)
    case let v as Float: self = .float(v)
    case let v as Bool: self = .bool(v)
    ...
    default: return nil
  }
}
Run Code Online (Sandbox Code Playgroud)

有了它,调用Value(3)返回一个(可选)Value.int(3),如预期的那样.Bool和其他类型也有效.

但是Value(0.1)命中默认情况并返回nil.

(编辑正确性和推荐的风格.感谢大家指出这些问题.)

Jac*_*nce 12

浮点常量的默认推断类型Double不是Float.它由swift标准库定义:https://developer.apple.com/reference/swift/floatliteraltype,使用编译器已知的FloatLiteralTypetypealias.


Wil*_* Hu 6

类型推断的文档说:

当推断浮点数的类型时,Swift总是选择Double(而不是Float).

如果要使用Float,则必须显式转换文字:

enum Value {
    case Int(Int)
    case Float(Float)
    case Bool(Bool)
    case Double(Double)
    init?(v:Any) {
        switch v {
        case let v as Int: self = .Int(v)
        case let v as Float: self = .Float(v)
        case let v as Bool: self = .Bool(v)
        case let v as Double: self = .Double(v)
        default: return nil
        }
    }
}


Value(v: 0.1) //Infer Double > Result: Double(0.10000000000000001)
Value(v: Float(0.0002)) //Specify Float > Result: Float(0.000199999995)
Run Code Online (Sandbox Code Playgroud)

  • 请提供有关您的代码工作原因的somme说明 (3认同)