答案 0 :(得分:26)
Swift / Foundation中有许多不同类型的数字。您的NSKeyValueCoding
已设置为NSNumber
的实例(请参阅下面的JSON序列化文档摘录),因此您需要按原样阅读,然后要求将此NSNumber
转换为Float
如果需要:
if let n = d.value(forKey: "probability") as? NSNumber {
let f = n.floatValue
}
JSONSerialization
文档说:
可以转换为JSON的Foundation对象必须具有 以下属性:
- 顶级对象是NSArray或 的NSDictionary。
- 所有对象都是NSString, NSNumber 的实例, NSArray,NSDictionary或NSNull。
- 所有字典键都是NSString的实例。
- 数字不是NaN或无穷大。
答案 1 :(得分:0)
您使用的是错误的API。
除非你真的需要KVC,否则不要使用KVC(valueForKey
)。
要获取字典值,请始终使用密钥订阅(或objectForKey
)
if let probability = d["probability"] as? Float {
print(probability)
}
答案 2 :(得分:0)
我建议完全放弃字典表示并使用Decodable
转移到类型安全的解析器:
struct User: Decodable {
let name: String
let gender: String
let probability: Float
let count: Int
}
let str = "{ \"name\": \"Tomas\", \"gender\": \"male\", \"probability\":0.99, \"count\": 594 }"
let data = str.data(using: .utf8)!
do {
let user = try JSONDecoder().decode(User.self, from: data)
} catch {
// handle errors
}