NSDictionary initWithContentsOfFile: портит NSDecimalNumbers, почему? - PullRequest
2 голосов
/ 12 января 2009

В моем приложении для iPhone я использую NSDecimalNumber для хранения некоторых значений курсов валют. Я извлекаю данные из Интернета при первом запуске приложения, а затем снова, когда они устаревают, и сохраняю их в NSDictionary; тогда я использую writeToFile:atomically:.

Когда приложение запускается впервые, мой метод конвертации тарифов работает нормально. Тем не менее, когда я запускаю приложение во второй раз, и ставки загружаются с -(NSDictionary*) initWithContentsOfFile:, методы конвертации перестают работать, и я получаю странные результаты.

Я выполнил некоторую отладку с контрольными точками в инкриминированном методе и обнаружил, что данные по ставкам рассматриваются как NSCFNumber, а не NSDecimalNumber. Похоже, что initWithContentsOfFile не назначает правильный класс моим объектам. Для записи фактическое значение этих объектов, как показано в методе description, соответствует ожидаемому значению ставки.

Я также проверил файл plist, сгенерированный writeToFile:atomically:, и увидел, что ставки хранятся как real; Интересно, это правильный тип?

Есть идеи, что происходит?

Заранее спасибо,
Davide

Ответы [ 2 ]

6 голосов
/ 12 января 2009

Списки свойств не различают десятичные числа и числа с плавающей точкой. Элемент real содержит число с плавающей точкой. (Действительно, сама сериализация может просто NSNumber отправлять floatValue себе, не подозревая, что экземпляр на самом деле является подклассом. Это означало бы, что преобразование в плавающую точку происходит, когда вы генерируете список данные, а не когда вы читаете их обратно.)

Думаю, вам придется хранить это как строку. Надеюсь, это без потерь.

5 голосов
/ 12 января 2009

Списки работают только с определенными типами данных, и NSNumber является одним из них. Если вы хотите NSDecimalNumber, то у вас есть два способа сделать это. Во-первых, продолжать использовать списки и затем преобразовывать все NSNumbers в NSDecimalNumbers после загрузки. Второе - перейти на использование NSKeyedArchiver для хранения данных. Это требует больше кода, но означает, что если вы сохраните NSDecimalNumber, вы получите NSDecimalNumber обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...