无法将NSNumber桥接到Float Swift 3.3

Mal*_*lik 2 json swift

在Xcode更新后,我遇到了一个奇怪的问题.在我的应用程序中,当我从API获得响应时,我手动解析它并将其映射到我的模型.在我的代码中有很多地方我将JSON值转换Float为null合并,如下所示:

randomVariable = jsonDict["jsonKey"] as? Float ?? 0
Run Code Online (Sandbox Code Playgroud)

它曾经工作正常,但在更新后,它总是默认为0.为了确定原因,我试着强制将它投射到Float下面

randomVariable = jsonDict["jsonKey"] as! Float
Run Code Online (Sandbox Code Playgroud)

这导致以下错误

无法将NSNumber桥接到Float

经过进一步调查,我发现Xcode正在使用Swift 3.3(以前,它使用的是Swift 3.2).我在StackOverflow上找到的解决方案围绕着将其转换为NSNumber而不是Float.正如我上面提到的,我的应用程序中有类似的代码行.我想知道是否有办法解决这个问题.也许使用某种扩展?

OOP*_*Per 11

如您所见,您可能需要先将其投射到NSNumber.

像这样的东西:

randomVariable = (jsonDict["jsonKey"] as? NSNumber)?.floatValue ?? 0
Run Code Online (Sandbox Code Playgroud)

也许正则表达式替换可以帮助您更新代码.

图案: jsonDict\[([^\]]*)\] as\? Float

用...来代替: (jsonDict[$1] as? NSNumber)?.floatValue


Prc*_*ela 5

问题出在32位架构中,并在swift 4.1中更新了NSNumber类。

例如,当我将1.1写入字典时,它将以最准确的表示形式存储为64位NSNumber = 1.10000000000000008881784197001 ...

所以,当你读这个号码为!浮动会失败,因为32位精度不足以获取这种最准确的表示形式。

32位的最准确表示形式= 1.10000002384185791015625

浮点数的64位表示

因此,您需要获取在NSNumber.floatValue()函数内部实现的截断结果。

randomVariable = (jsonDict["jsonKey"] as! NSNumber).floatValue
Run Code Online (Sandbox Code Playgroud)