Лучший способ обработать постоянное логическое значение в plist? - PullRequest
3 голосов
/ 04 января 2010

Каков наилучший способ обработки логических значений, которые берутся из настроек UISwitch и хранятся в NSMutableDictionary, который сохраняется в каталоге пользователя в качестве постоянных настроек? В частности, каков наилучший способ отличить логические значения от числовых значений в NSMutableDictionary, который записывается и читается из файловой системы?

========

добавлено: Спасибо Адриану и Бену. Таким образом, в результате, если хранится через [NSNumber numberWithBool:] (это то, что я делал), то нет удобного способа определить, возникла ли эта величина как логическое значение, правильно?

Вторая часть этого заключается в том, что NSMutableDictionary, который я храню, изначально создается путем создания его через plist, который имеет логические значения. Эти значения имеют класс NSCFBoolean при первом чтении. Сейчас моя стратегия состоит в том, чтобы сравнить значение, с которым я работаю в словаре, с соответствующей записью в plist.

Причина, по которой это имеет значение, заключается в том, что я генерирую элементы интерфейса на лету, чтобы позволить пользователю манипулировать этими значениями, и связываю логические значения с UISwitch. Если я потеряю исходный класс при преобразовании в число, я получаю неподходящий элемент пользовательского интерфейса.

Я рассматриваю подстановку массивов в качестве сохраненного значения, где первое значение - это сохраненное значение, а остальные записи - это выбор: там, где существует два варианта, он рассматривается как логическое значение ... в других случаях они служить ценностями сборщика. Но это кажется громоздким, если надежным.

Любые идеи приветствуются ...

Ответы [ 3 ]

11 голосов
/ 04 января 2010

Значения BOOL сериализуются как экземпляры NSNumber, созданные с помощью numberNithBool NSNumber: статический метод:

BOOL ok = YES;
NSNumber *value = [NSNumber numberWithBool:ok];

// ...later...

BOOL answer = [value boolValue];

Нет другого способа сериализации значений BOOL. В сгенерированном plist, если он сохранен как XML, значения BOOL отображаются как сущности и .

(издание от 17 января 2010 г.)

После моего комментария выше этот фрагмент кода может помочь идентифицировать различные подтипы экземпляров NSNumber, когда они загружаются в память, используя сообщение "objCType":

NSString *path = [[NSBundle mainBundle] pathForResource:@"untitled" 
                                                 ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:path];

for (id item in array)
{
    NSLog(@"%@", [NSString stringWithCString:[item objCType] 
                                    encoding:NSUTF8StringEncoding]);
}

Где untitled.plist имеет такую ​​структуру:

<plist version="1.0">
<array>
    <integer>123</integer>
    <true/>
    <real>1.2</real>
</array>
</plist>

В этом случае выполнение приведенного выше кода дает следующее:

2010-01-17 17:04:35.100 Untitled[62206:207] q
2010-01-17 17:04:35.101 Untitled[62206:207] c
2010-01-17 17:04:35.102 Untitled[62206:207] d

Может быть, есть другой способ получить внутренний тип данных, хранящихся в NSNumber, но, похоже, это помогает.

3 голосов
/ 04 января 2010

Вы также можете использовать константы kCFBooleanTrue и kCFBooleanFalse, хотя, чтобы добавить их к NS-чему-либо, вам нужно будет привести их в качестве идентификаторов:

[myDictionary setObject: (id) kCFBooleanTrue forKey: @"am_I_awesome"];
1 голос
/ 07 сентября 2011

Объекты CFBoolean используются для представления логических значений в списках и коллекциях CoreFoundation. Использование CFBoolean обеспечивает максимальную совместимость, особенно при обмене данными со сторонним программным обеспечением.

Следующая функция возвращает значение объекта CFBoolean как логическое значение типа C.

Boolean CFBooleanGetValue (CFBooleanRef boolean);

Следующие константы обеспечивают доступ к истинным и ложным объектам.

const CFBooleanRef kCFBooleanTrue;
const CFBooleanRef kCFBooleanFalse;
...