今天我从字典中获取价值时遇到了一个非常奇怪的情况。我在这里做了两个案例。
案例1
如果我在下面写代码
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块但是它打印了值。
案例2
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
请向我解释为什么会这样?
答案 0 :(得分:3)
答案是 - 这两个案例中的词典实际上并不相同。
在第二种情况下,dict["num"]
类型中Int
的值,因为您明确指定了Int
。
但是,在第一种情况下,您会通过JSONSerialization
获取字典,将数字转换为NSNumber
个实例。因此,dict["num"]
的值为NSNumber
类型。使用NSNumber
初始化的Int
可以成功投放到Int
和Float
答案 1 :(得分:0)
在第一种情况下,您正在创建json并插入dict
,其中获取[String: Any]
格式的值。此处dict["num"]
采用NSNumber
格式。
在第二种情况下,您使用dict
格式创建了[String: Any]
,但将值设为Int
。 var test = 2
此行将变量test
设置为Int,当您将该值插入dict
格式[String: Any]
时,它将格式Any
的值设为Int
。
所以基本上在第二种情况下,dict["num"]
是Int
。
From Apple Doc,变量将采用它在开头分配的值的数据类型。
这就是为什么你可以在第一种情况下将Any转换为Float但在第二种情况下无法将Int转换为Float。
如果您尝试使用var test: Float = 2
,您也会在第二种情况下获得值。
答案 2 :(得分:0)
尝试
/home/alperen/Desktop/scpTest