Я работаю над приложением, которое использует Базовые Данные в качестве его бэкенда для управления записями SQLite. Я имею все работающее со строками и числами, но только что попытался добавить поля BOOL и, может казаться, не получаю вещи работать.
В .xcdatamodel я добавил поле к своему названному объекту isCurrentlyForSale
который не является Дополнительным, не Переходным, и не Индексируемым. Тип атрибута установлен на булевскую переменную со значением по умолчанию НЕТ.
Когда я создал файлы класса из модели данных, шаблонный код, добавленный для этого свойства в.h заголовке, был:
@property (nonatomic, retain) NSNumber * isCurrentlyForSale;
наряду с
@dynamic isCurrentlyForSale;
в.m файле реализации.
Я всегда работал с булевскими переменными как простой BOOLs. Я считал, что мог использовать NSNumber's numberWithBool
и boolValue
методы, но это походит на aweful партию дополнительного кода для чего-то настолько простого.
Может @property в заголовке быть измененным на простой BOOL? Раз так есть ли что-нибудь, чтобы не упустить?
Спасибо - Джон
Простой ответ: нет, вы не можете изменить объявление @property
так, чтобы оно возвращало BOOL
.
Однако вы можете написать несколько простых оболочек. Я бы переименовал атрибут в currentForSale
(что означает, что он генерирует currentForSale
и setCurrentlyForSale:
), а затем напишу две оболочки:
- (BOOL) isCurrentlyForSale {
return [[self currentlyForSale] boolValue];
}
- (void) setIsCurrentlyForSale:(BOOL)forSale {
[self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}
Хотя ответ Дэйва Делонга близок, вы можете сделать это без необходимости менять название свойства.
Вы можете изменить свойство, чтобы вернуть 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
, не является отличной идеей, отсюда и его удаление в примере кода.