Как сериализовать перечисления ObjC в JSON? - PullRequest
2 голосов
/ 28 февраля 2010

Я хотел бы сохранить настройки скина моего приложения в файле json. Как мне сохранить значения перечисления для цветов / стилей и т. Д., А затем привести их обратно из строки? Как мне хранить MKPinAnnotationColorRed или UITableViewStyleGrouped?

Если это просто вопрос сохранения целочисленного эквивалента, я согласен с этим, вместо того, чтобы фактически хранить строковое значение enum.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2010

Короткий ответ: вы не можете.

Если вы не делаете одну из нескольких вещей:

  1. Сохранить целочисленное значение enum в файле json. (это ваше «Если это просто вопрос сохранения целочисленного эквивалента, то я в порядке с этим, а не фактически с сохранением значения строки перечисления», что кажется самым простым и лучшим решением).
  2. Сохраните отдельный массив значений enum в виде строк, сравните их и верните индекс правильной записи.
  3. Вместо перечисления используйте строковые константы.
  4. Вместо перечисления используйте четырехсимвольные константы, которые можно анализировать как целое число или строку.
3 голосов
/ 28 февраля 2010

«Я хотел бы сохранить настройки обложки своих приложений в файле json» - это неправильный подход на iPhone. ОС предоставляет класс NSUserDefaults, который обрабатывает все детали для вас.

Например, для хранения значения перечисления (которые на самом деле являются целочисленными значениями):

[[NSUserDefaults standardUserDefaults] setInteger: annotationColor
    forKey: @"SomeKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

Вы также можете легко хранить и извлекать сериализованные объекты или собственные типы (массивы, символы, числа, строки).

2 голосов
/ 01 марта 2010

Вы должны создать некоторое явное отображение между перечислениями и строками. Один подход будет следующим:

#define ENTRY(x) [NSNumber numberWithInt:x], @#x

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
    ENTRY(enumOne),
    ENTRY(enumTwo),
    ENTRY(enumThree),
    nil];

#undef ENTRY

NSNumber* index = [dict objectForKey:@"enumOne"]);

Обратите внимание, что это общий подход, если у вас есть перечислимые значения, которые равноудалены, вам не нужно хранить их числовое значение и вы можете использовать, например, NSArray вместо.

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