在以前的版本中,要从[String: Any]
字典中获取浮点值,我可以使用let float = dict["somekey"] as? Float
,但在 swift4.1 中,它不起作用。似乎 of 的类型在我得到它之前dict["somekey"]
已经被隐式推断,所以从to 转换总是失败。我想知道这是一个新特性还是只是一个错误。Double
Double
Float
——这里是更新。
我重新下载了一个 Xcode9.2 并做了一些实验,现在我想我知道发生了什么。这是测试代码:
let dict: [String : Any] = ["key": 0.1]
if let float: Float = dict["key"] as? Float {
print(float)
} else {
print("nil")
}
let dict1: [String : Any] = ["key": NSNumber(value: 0.2)]
if let float: Float = dict1["key"] as? Float {
print(float)
} else {
print("nil")
}
let number = NSNumber(value: 0.3)
if let float: Float = number as? Float {
print(float)
} else {
print("nil")
}
let number1 = NSNumber(floatLiteral: 0.4)
if let float = number1 as? Float {
print(float)
} else {
print("nil")
}
在 Swift4 和 Swift4.1 的 Playground 中运行这段代码,结果是不一样的。在 Swift4 中,结果为nil
0.2
0.3
0.4
,而在 Swift4.1 中,结果为nil
nil
nil
nil
。从结果中,我可以了解到两点: 1. 当我们将 JSON 数据转换为[String : Any] dictionary
带有JSONSerialization
类的 a 时,数值被保存为NSNumber
对象,而不是Int
,Double
或Float
。2. 在Swift4中,我们可以使用let float = NSNumberOjbect as? Float
来获取一个Float
值,但是在Swift4.1中我们不能。但是,我们仍然可以通过这种方式获取Int
或Double
赋值,无论是在 Swift4 还是 Swift4.1 中。最后,这是一个新功能还是一个错误?如果有人知道,你们可以显示公告链接吗?