你需要区分两种情况(在 Swift 3 中是三种情况):
-
Any
包含 Swift 原生Double
-
Any
含有一个NSNumber
(在 Swift 3 中,有类型保留NSNumber case正常以外的NSNumber
.)
当你创建一个原生 SwiftDictionary
例如[String: Any]
,并设置Double
在更新中以正常方式值:
let dict: [String : Any] = ["key": 0.1]
在这种情况下,Any
保存代表的元数据Double
和原始值0.1
as Double
.
并铸造Any
保持Double
to Float
总是失败。作为Double
to Float
不能转换为as
-铸件。
let dblValue: Double = 0.1
if let fltValue = dblValue as? Float { //<-Cast from 'Double' to unrelated type 'Float' always fails
print(fltValue)
} else {
print("Cannot convert to Float")
}
//->Cannot convert to Float
但是,如果出现Any
保持NSNumber
,就像往常一样,当Array
or Dictionary
桥接自NSArray
or NSDictionary
,以前的 Swift 和 Swift 4.1 之间的行为有所不同。
的结果JSONSerialization
符合这个案例。
在前雨燕队中,(正常)NSNumber
to Float
这是一次总是成功的行动。
在 Swift 4.1 中,行为随着我在评论中展示的新功能而改变:
SE-0170 NSNumber 桥接和数字类型
我省略了 Swift 3 中曾经发现的第三种情况,它已经过去了。
但如何获得你的信息非常重要Dictionary
or Array
,以及如何设置它们的值来解决问题Any
to Float
.
最后,这是一个新功能还是一个错误?如果有人知道的话,可以给个公告链接吗?
这是一个新功能,而不是一个错误。请参阅上面的链接和下面的相关主题。
无法将 NSNumber 桥接到 Float Swift 3.3
将 NSNumber 转换为 Float 时出现意外行为