JSON解析遇Fatal error: Unable to bridge NSNumber to Float问题求助
解决“Unable to bridge NSNumber to Float”的JSON解析错误
嘿,这个问题我之前帮好几个开发者踩过坑,其实核心就是Swift和Foundation类型桥接时的一个小陷阱,咱们一步步理清楚:
问题根源
你的JSON里的probability是0.99(浮点数值),count是594(整数值)——在iOS/macOS的JSON解析流程中,系统会把所有JSON数值统一转换成NSNumber对象。而Swift的类型安全机制不允许直接把**整数类型的NSNumber**桥接到Float:比如count对应的594是整数存储的NSNumber,直接强转Float就会触发这个致命错误;而probability是浮点存储的NSNumber,反而能正常桥接,这也是为什么你可能只在部分字段上遇到问题。
三种解决方法
方法一:用NSNumber的floatValue属性(最直接)
不要直接强转,而是调用NSNumber自带的floatValue方法,它会自动处理内部是整数还是浮点数的情况:
// 假设json是解析后的[AnyHashable: Any]字典 if let probabilityNum = json["probability"] as? NSNumber { let probability: Float = probabilityNum.floatValue } if let countNum = json["count"] as? NSNumber { let count: Float = countNum.floatValue }
方法二:用Swift原生Double中转(更符合Swift风格)
JSON数值在Swift中可以先转成Double(它兼容整数和浮点数),再转成Float,完全避开NSNumber的桥接问题:
if let probability = json["probability"] as? Double { let probFloat: Float = Float(probability) } if let count = json["count"] as? Double { let countFloat: Float = Float(count) }
方法三:用Codable做类型安全解析(最佳实践)
如果你的项目是Swift 4+,强烈建议用Codable,它会自动处理这种类型兼容问题,代码更简洁也更安全:
首先定义对应模型:
struct Person: Codable { let name: String let gender: String let probability: Float let count: Float }
然后解析JSON:
let jsonString = """ {"name":"Tomas","gender":"male","probability":0.99,"count":594} """ guard let jsonData = jsonString.data(using: .utf8) else { return } do { let person = try JSONDecoder().decode(Person.self, from: jsonData) print("概率:\(person.probability),计数:\(person.count)") } catch { print("解析错误:\(error)") }
Codable会自动把JSON里的整数或浮点数转换成你定义的Float类型,完全不用手动处理桥接细节。
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

