今天在从字典取值的时候遇到了一个很奇怪的情况,我这里做了两个案例。
案例一
如果我在下面写代码
let str = "{\"num\":2}"
var dict = convertToDictionary(text: str)!
if let num = dict["num"] as? Float {
print("Value is \(num)")
} else {
print("parse error")
}
func convertToDictionary(text: String) -> [String: Any]? {
if let data = text.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
print(error.localizedDescription)
}
}
return nil
}
如您所见,键 num
的值是 Integer
,但是从字典中获取值时,我希望值是 Float
。所以它应该转到 else block ,但它会打印值。
案例二
var test = 2
var dict:[String:Any] = [String:Any]()
dict["num"] = test
if let num = dict["num"] as? Float {
print("Value is \(num)")
} else {
print("parse error")
}
因为我没有定义数据类型,所以默认情况下它应该是整数,我希望值是 Float
。这确实如我所料
现在这里不打印值,它显示 parse error
请向我解释为什么会这样?
最佳答案
答案是 - 这两种情况下的字典实际上并不相同。
在第二种情况下,dict["num"]
的值是 Int
类型的,因为你明确地给它分配了一个 Int
.
然而,在第一种情况下,您通过 JSONSerialization
获得字典,它将数字转换为 NSNumber
实例。所以,dict["num"]
的值是NSNumber
类型。并且使用 Int
初始化的 NSNumber
可以成功地转换为 Int
和 Float
关于swift - 在 swift 中解析 float 时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48704416/