在之前的版本中,我可以使用
--以下是更新内容。
我重新下载了Xcode9.2并进行了一些实验,现在我想我明白了发生了什么。这是测试代码:
在Swift4和Swift4.1的Playground中运行此代码,结果不同。在Swift4中,结果为
let float = dict["somekey"] as? Float
从一个 [String: Any]
字典中获取一个浮点值,但在Swift4.1中,它不再起作用。似乎在我获取它之前,dict["somekey"]
的类型已被隐式推断为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. 当我们使用JSONSerialization
类将JSON数据转换为[String:Any]字典
时,数值会保存为NSNumber
对象,而不是Int
、Double
或Float
。
2. 在Swift4中,我们可以使用let float = NSNumberOjbect as? Float
来获取Float
值,但在Swift4.1中我们不能。但是,在Swift4或Swift4.1中仍然可以以这种方式获取Int
或Double
值。
最后,这是一个新特性还是一个错误?如果有人知道,请给出公告链接吗?
dict
是Swift本地的[String: Any]
时。当一个NSDictionary
被导入为[String: Any]
时,行为是不同的。 - OOPerguard let float: Float = dict["key"] as? Float else { return }
,可以在Swift4.0中获取一个浮点数值,但在Swift4.1中退出。 - LYM0.5
或0.25
进行样例代码测试,这些值可以精确表示为Float
。 - OOPer