iOS 5: возможно ли записать структуру в файл plist? - PullRequest
2 голосов
/ 04 марта 2012

У меня есть структура, определенная следующим образом:

typedef struct {
    NSString *SportName;
    NSInteger numberOfPeriods;
    CFTimeInterval periodLength;
    NSString *periodName;
    CFTimeInterval secondaryClockTime;
    NSString *LeftSecondaryCounterName;
    NSString *RightSecondaryCounterName;
    bool PossessionArrow;
} GamePreset;

Можно ли записать переменные типа GamePreset в файл plist?

1 Ответ

2 голосов
/ 04 марта 2012

Нет встроенной поддержки записи произвольного struct в виде списка свойств. Вы должны написать метод, который преобразует структуру в список свойств.

Теоретически, вы можете сделать это во время выполнения, проанализировав результат @encode(GamePreset), который заменяется (во время компиляции) строкой, описывающей GamePreset:

NSLog(@"encode = %s", @encode(GamePreset));
...
2012-03-04 00:57:43.456 encodetest[43337:903] encode = {?=@qd@d@@B}

Это имеет серьезные недостатки. Во-первых, вы не получаете имен полей, поэтому ваш список не будет особенно полезен, если читатель не знает формат struct, а любое изменение макета struct сделает сохраненные списки нечитаемыми.

Другим большим недостатком является то, что строка @encode не содержит никакой информации о заполнении структуры. Вы должны учитывать это при разборе строки. Я думаю, что вы можете использовать NSGetSizeAndAlignment, чтобы помочь с этим.

Если вы хотите рискнуть своим здравомыслием и попробовать это, прочитайте раздел «Типовые кодировки» Objective-C Runtime Programming Guide .

Я рекомендую вам просто прикусить пулю и написать простую функцию, которая принимает GamePreset * и возвращает NSDictionary *, используя жестко запрограммированные знания структуры структуры.

...