Базовые Данные и установка BOOL

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

В .xcdatamodel я добавил поле к своему названному объекту isCurrentlyForSale который не является Дополнительным, не Переходным, и не Индексируемым. Тип атрибута установлен на булевскую переменную со значением по умолчанию НЕТ.

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

@property (nonatomic, retain) NSNumber * isCurrentlyForSale;

наряду с

@dynamic isCurrentlyForSale;

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

Я всегда работал с булевскими переменными как простой BOOLs. Я считал, что мог использовать NSNumber's numberWithBool и boolValue методы, но это походит на aweful партию дополнительного кода для чего-то настолько простого.

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

Спасибо - Джон

9
задан John Valen 17 May 2010 в 15:46
поделиться

2 ответа

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

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

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

- (void) setIsCurrentlyForSale:(BOOL)forSale {
  [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}
2
ответ дан 4 December 2019 в 07:04
поделиться

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

Вы можете изменить свойство, чтобы вернуть 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, не является отличной идеей, отсюда и его удаление в примере кода.

30
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: