2010-05-17 4 views
9

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

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

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

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

вместе с

@dynamic isCurrentlyForSale; 

в ом файл реализации.

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

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

Благодаря -John

ответ

2

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

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

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

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

Изделие или собственность должны иметь «есть» в нем. Вот почему '@ property' имеет параметр' getter = '. И да, вы можете изменить '@ property' на BOOL, используя примитивные аксессоры, которые являются частью Core Data. –

+0

@Marcus Да, я знаю, что сеттеры не должны иметь 'Is' в них, но я ввел его, потому что' setCurrentlyForSale: 'уже был сделан CD (и я знаю о' getter = 'и' setter = '. И вы говорите, что можете просто изменить 'NSNumber *' на 'BOOL' в заголовке, и это сработает?Это меня удивило бы. –

30

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

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

+0

+1 ах, я получаю то, что вы сейчас говорите. Я думал, вы подразумеваете, что вы можете изменить свойство '@ property' на' BOOL', а не реализовывать собственные методы. В стороне, сеттер немного некорректен. '(Will | did) ChangeValueForKey:' должен вызываться только в том случае, если новое значение действительно отличается (т. Е. Вам нужен оператор if). –

+0

Отличный пример и объяснение - спасибо Marcus! –

+0

Единственное, что я добавил бы, это то, что мне нравится использовать константы NSString для имен ключей, это избавляет от необходимости беспокоиться о типографических ошибках позже. 'NSString * const Текущий ForSale = @" nowForSale ";' – Eric

Смежные вопросы