在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
问题出在32位架构中,并在swift 4.1中更新了NSNumber类。
例如,当我将1.1写入字典时,它将以最准确的表示形式存储为64位NSNumber = 1.10000000000000008881784197001 ...
所以,当你读这个号码为!浮动会失败,因为32位精度不足以获取这种最准确的表示形式。
32位的最准确表示形式= 1.10000002384185791015625
因此,您需要获取在NSNumber.floatValue()函数内部实现的截断结果。
randomVariable = (jsonDict["jsonKey"] as! NSNumber).floatValue
Run Code Online (Sandbox Code Playgroud)