我有一个标记值的枚举(这是来自玩具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,使用编译器已知的FloatLiteralType
typealias.
类型推断的文档说:
当推断浮点数的类型时,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 次 |
最近记录: |