首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDictionary initWithContentsOfFile:搞乱NSDecimalNumbers,为什么?

NSDictionary initWithContentsOfFile:搞乱NSDecimalNumbers,为什么?
EN

Stack Overflow用户
提问于 2009-01-12 00:58:49
回答 2查看 1.8K关注 0票数 2

在我的iPhone应用程序中,我使用NSDecimalNumber来存储一些货币汇率值。我在应用程序第一次启动时从web上提取数据,然后在它们过时时再次从web上提取数据,并将它们存储在NSDictionary中;然后我使用writeToFile:atomically:

当应用程序第一次启动时,我的速率转换方法工作正常。然而,当我第二次启动应用程序时,-(NSDictionary*) initWithContentsOfFile:加载了rates,转换方法停止工作,我得到了奇怪的结果。

我在相关方法中对断点进行了一些调试,我发现rates数据被视为NSCFNumber,而不是NSDecimalNumber。所以看起来initWithContentsOfFile没有给我的对象分配正确的类。对于记录,这些对象的实际值,如description方法中所示,对应于预期的率值。

我还检查了writeToFile:atomically:生成的plist文件,发现rates被存储为real;我想知道这是否是正确的类型。

知道是怎么回事吗?

提前谢谢你,

戴维德

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-12 01:12:54

属性列表不区分十进制数和浮点数。real元素包含一个浮点数。(实际上,序列化本身可能只是NSNumberfloatValue发送给它自己,而不知道实例实际上是一个子类。这意味着向浮点数的转换是在生成plist数据时发生的,而不是在读回数据时发生的。)

我想,您必须将其存储为字符串。希望这是无损的。

票数 6
EN

Stack Overflow用户

发布于 2009-01-12 01:21:52

Plist只适用于某些数据类型,NSNumber就是其中之一。如果你想要NSDecimalNumber,你有两种方法。第一种方法是继续使用NSDecimalNumbers,然后在加载后将所有的plist转换为plist。第二种方法是改用NSKeyedArchiver来存储数据。这需要更多的代码,但这意味着如果保存一个NSDecimalNumber,就会得到一个NSDecimalNumber。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/434145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档