Восстановление BOOL внутри NSDictionary из файла plist

У меня есть файл plist, содержащий массив словарей. Вот один из них:

Словарь Фреда
Имя Фред
isMale [флажок отмечен]

Итак, теперь я инициализирую свой объект Person со словарем, который я прочитал из файла plist:

 -(id) initWithDictionary: (NSDictionary *) dictionary {
    if (self = [super init])
    self.name = [dictionary valueForKey: @"Name"];
    self.isMale = ????
  }

Как завершить приведенный выше код, чтобы для self.isMale было установлено значение YES, если флажок установлен в файле plist, и NO, если это не так. Желательно также установить NO, если в словаре нет ключа isMale.


person William Jockusch    schedule 29.09.2010    source источник


Ответы (2)


Значения BOOL обычно хранятся в контейнерах obj-c, обернутых в объект NSNumber. Если это так в вашем случае, вы можете получить логическое значение, используя:

self.isMale = [[dictionary objectForKey:@"isMale"] boolValue];
person Vladimir    schedule 29.09.2010

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

Что-то типа:

id isMale = [dictionary valueForKey:@"isMale"];
self.isMale = isMale ? [isMale boolValue] : NO;

Который проверяет, существует ли значение для ключа «isMale» в словаре. Если да, то он получает от него boolValue. Если это не так, то он устанавливает для self.isMale значение по умолчанию NO.

person djdrzzy    schedule 29.09.2010
comment
Это необходимо только в том случае, если вы хотите, чтобы человек по умолчанию был мужчиной (по умолчанию YES). Вы можете отправить сообщение на nil (возвращаемое значение -[NSDictionary objectForKey:] и -[NSDictionary valueForKey:], когда ключ отсутствует в словаре), не проверяя сначала, согласны ли вы со значением по умолчанию NO. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ - person Peter Hosey; 29.09.2010
comment
Ах да ты прав. Я застрял между попыткой дать общий ответ для значений, отличных от BOOL (например, NSString), и предоставлением общего способа предоставления значений по умолчанию. - person djdrzzy; 30.09.2010
comment
Я собираюсь быть придурком и сказать, что Apple не гарантирует, что NO всегда будет определено как (BOOL) 0, хотя в этом случае значение по умолчанию может не всегда быть NO. :P Если бы они когда-нибудь изменили это, это было бы довольно глупо и непрактично. - person djdrzzy; 30.09.2010
comment
Не в последнюю очередь потому, что тогда это не будет работать с оператором C if, который проверяет, не равно ли выражение условия 0. ☺ - person Peter Hosey; 30.09.2010