Основные данные и настройка BOOL - PullRequest
9 голосов
/ 17 мая 2010

Я работаю над приложением, которое использует Core Data в качестве бэкэнда для управления записями SQLite. У меня все работает со строками и числами, но я только что попытался добавить поля BOOL и не могу заставить работать что-то.

В .xcdatamodel я добавил к моему объекту поле с именем isCurrentlyForSale, которое не является необязательным, не временным и не проиндексировано. Тип атрибута имеет значение Boolean со значением по умолчанию NO.

Когда я создал файлы классов из модели данных, шаблон кода, добавленный для этого свойства в заголовке .h, был:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale;

вместе с

@dynamic isCurrentlyForSale;

в файле реализации .m.

Я всегда работал с логическими значениями как с простыми BOOL. Я читал, что могу использовать методы numberWithBool и boolValue NSNumber, но это кажется огромным количеством дополнительного кода для чего-то такого простого.

Можно ли изменить @property в заголовке на простую BOOL? Если да, то есть ли на что обратить внимание?

Спасибо -John

Ответы [ 2 ]

30 голосов
/ 18 мая 2010

Хотя ответ Дейва Делонга близок, вы можете сделать это, не меняя название свойства.

Вы можете изменить свойство, чтобы вернуть BOOL, но затем вам нужно написать методы доступа вручную, и они немного отличаются от того, что Дейв имеет в своем ответе.

Сначала ваш @property должен быть определен как:

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale;

Затем в файле реализации вместо объявления свойства @dynamic создайте методы доступа напрямую.

- (BOOL)isCurrentlyForSale
{
  [self willAccessValueForKey:@"currentlyForSale"];
  BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue];
  [self didAccessValueForKey:@"currentlyForSale"];
  return b;
}

- (void)setCurrentlyForSale:(BOOL)b
{
  [self willChangeValueForKey:@"currentlyForSale"];
  [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"];
  [self didChangeValueForKey:@"currentlyForSale"];
}

С помощью этих методов доступа ваш объект будет обрабатывать бокс для вас, и вы сможете получить к нему доступ в качестве примитивного значения. Кроме того, сеттер, начинающийся с setIs, не очень хорошая идея, поэтому его удаление в примере кода.

2 голосов
/ 17 мая 2010

Простой ответ: Нет, вы не можете изменить объявление @property для возврата BOOL.

Вы можете написать несколько простых оболочек. Я бы переименовал атрибут в currentlyForSale (что означает, что он генерирует currentlyForSale и setCurrentlyForSale:), а затем написал бы две оболочки:

- (BOOL) isCurrentlyForSale {
  return [[self currentlyForSale] boolValue];
}

- (void) setIsCurrentlyForSale:(BOOL)forSale {
  [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...