Ошибка Objective C: свойство 'active' является скалярным типом в классе 'Routine'. Не могу сгенерировать для него метод получения - PullRequest
7 голосов
/ 20 июля 2009

Я получаю вышеуказанную ошибку, когда в симуляторе iphone (3.0 OS) выполняется следующее:

@interface Routine : NSManagedObject {

}

@property (nonatomic) BOOL active;

@implementation Routine
@dynamic active
@end

Как видите, я создаю подкласс NSManagedObject, потому что я использую Core Data. В моей модели данных «активный» является атрибутом параметра типа Boolean.

Что я здесь не так делаю?

Спасибо!

Ответы [ 2 ]

17 голосов
/ 20 июля 2009

Все, что выходит с CD - это объект, а не скалер. Итак, измените ваш код на:

@interface Routine : NSManagedObject {

}

@property (nonatomic) NSNumber * active;

@implementation Routine
@dynamic active
@end

Если вы хотите, вы можете добавить вспомогательный метод доступа для работы с ним в качестве скаляра:

- (BOOL) activeScalar {
  return self.active.boolValue;
}

- (void) setActiveScalar:(BOOL)active_ {
  self.active = [NSNumber numberWithBool:active_];
}

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

2 голосов
/ 30 ноября 2009

Как бы то ни было, я обнаружил, что документы предоставляют немного другое решение для скаляров. Как правило, вам не рекомендуется использовать скаляры вместо объектов, но если вы это сделаете, http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html объясняет, как это сделать. Вы используете "primitiveName" и "setPrimitiveName" для доступа к автоматически сгенерированным методам доступа, которые помещают ваш скаляр в объект (например, NSNumber). Затем создайте скалярное @property и напишите методы доступа для вашего свойства, которые используют примитивы.

Это кажется дорогим из-за того, что CoreData хранит ваш атрибут как скаляр в постоянном хранилище и преобразует его в объект, чтобы представить его как примитив. Поэтому, когда вы реализуете setName, когда я читаю документы и примеры кода, ваше значение помещается в объект, а затем скаляр снова извлекается в автоматической реализации setPrimitiveName. Похоже на ненужный маршалинг взад и вперед для каждого получения или сета.

...