我有一个标记值的枚举(这是来自玩具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.
类型推断的文档说:
当推断浮点数的类型时,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)
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |