NSDictionary initWithContentsOfFile:搞砸NSDecimalNumbers,为什么?
-
10-07-2019 - |
题
在我的iPhone应用程序中,我使用NSDecimalNumber
来存储一些货币汇率值。
我在第一次启动应用程序时从Web上提取数据,然后在它们过时时再次从中提取数据,然后将它们存储在NSDictionary
;然后我用writeToFile:atomically:
。
首次启动应用时,我的费率转换方法可以正常工作。然而,当我第二次启动应用程序,并且费率加载-(NSDictionary*) initWithContentsOfFile:
转换方法停止工作时,我得到了奇怪的结果。
我在有罪的方法中使用断点进行了一些调试,我发现费率数据被视为NSCFNumber
,而不是initWithContentsOfFile
。因此,似乎description
没有为我的对象分配正确的类。对于记录,这些对象的实际值(如real
方法中所示)对应于预期的速率值。
我还检查了由<=>生成的plist文件,并看到费率存储为<=>;我想知道这是否是正确的类型。
有什么想法吗?
提前致谢,
的Davide
解决方案
属性列表不区分十进制数和浮点数。 real
元素包含一个浮点数。 (实际上,序列化本身可能只是NSNumber
向自己发送floatValue
,而不知道该实例实际上是一个子类。这意味着当你生成时,会发生转换为浮点数。 plist数据,而不是当你再读回来时。)
我认为你必须将它存储为字符串。希望这是无损的。
其他提示
Plists仅适用于某些数据类型,NSNumber就是其中之一。如果你想要NSDecimalNumber,那么你有两种方法可以解决它。第一种是继续使用plists,然后在加载后将所有NSNumber转换为NSDecimalNumbers。第二种是切换到使用NSKeyedArchiver来存储数据。这需要更多代码,但意味着如果你保存NSDecimalNumber,你将得到一个NSDecimalNumber。