Вам нужно будет создать собственные средства доступа, если вы хотите ограничить значения перечислением. Итак, сначала вы должны объявить перечисление, например:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Затем объявите геттеры и сеттеры для своего свойства. Переопределение существующих - плохая идея, поскольку стандартные средства доступа ожидают объект NSNumber, а не скалярный тип, и вы столкнетесь с проблемами, если что-либо в привязках или системах KVO попытается получить доступ к вашему значению.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Наконец, вы должны реализовать + keyPathsForValuesAffecting<Key>
так, чтобы получать уведомления KVO для itemTypeRaw при изменении itemType.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
s?int16_t
и все готово.Вы можете сделать это проще:
В вашей модели задайте
itemType
16-битное число. Все сделано. Дополнительный код не требуется. Просто введите свой обычныйЕсли вы используете Xcode для создания своего
NSManagedObject
подкласса, убедитесь, что установлен флажок « использовать скалярные свойства для примитивных типов данных ».источник
retain
связано с управлением памятью, а не с тем, сохраняется она в базе данных или нет.Альтернативный подход, который я рассматриваю, состоит в том, чтобы вообще не объявлять перечисление, а вместо этого объявлять значения как методы категории в NSNumber.
источник
Если вы используете mogenerator, взгляните на это: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Вы можете вызвать атрибут Integer 16
itemType
соattributeValueScalarType
значениемItem
в информации о пользователе. Затем в информации о пользователе для вашей сущности задайтеadditionalHeaderFileName
имя заголовка, в которомItem
определено перечисление. При создании файлов заголовков mogenerator автоматически присвоит свойствуItem
тип.источник
Я установил тип атрибута как 16-битное целое число, затем использую это:
...
источник
Поскольку перечисления поддерживаются стандартным сокращением, вы также не можете использовать оболочку NSNumber и установить свойство напрямую как скалярное значение. Обязательно установите тип данных в основной модели данных как «Целое число 32».
MyEntity.h
В другом месте кода
Или парсинг из строки JSON или загрузка из файла
источник
Я делал это много и считаю полезной следующую форму:
В этом случае перечисление довольно простое:
и называю это педантичным, но я использую перечисления для имен полей, например:
Поскольку для сложных моделей данных это может оказаться трудоемким, я написал генератор кода, который использует MOM / сущности для вывода всех сопоставлений. Мои входные данные в конечном итоге являются словарем от типа Table / Row до Enum. Пока я занимался этим, я также сгенерировал код сериализации JSON. Я проделал это с очень сложными моделями, и это очень сэкономило время.
источник
Приведенный ниже код мне подходит, и я добавил его как полноценный рабочий пример. Я хотел бы услышать мнения об этом подходе, так как планирую широко использовать его в своих приложениях.
Я оставил @dynamic на месте, так как тогда он будет удовлетворен получателем / установщиком, указанным в свойстве.
Согласно ответу iKenndac, я не переопределил имена получателей / установщиков по умолчанию.
Я включил проверку диапазона с помощью NSAssert для допустимых значений typedef.
Я также добавил метод получения строкового значения для данного typedef.
Я ставлю перед константами префикс «c», а не «k». Я знаю причину «k» (математическое происхождение, историческое), но мне кажется, что я читаю код ESL вместе с ним, поэтому я использую «c». Просто личное дело.
Здесь есть аналогичный вопрос: typedef как тип данных Core
Буду признателен за любой вклад в этот подход.
источник
Решение для автоматически созданных классов
из генератора кода Xcode (iOS 10 и выше)
Если вы создаете объект с именем «YourClass», Xcode автоматически выберет «Определение класса» по умолчанию в качестве типа Codegen в «Инспекторе модели данных». это сгенерирует классы ниже:
Быстрая версия:
Версия Objective-C:
Мы выберем «Категория / Расширение» из опции Codegen вместо «Определение класса» в Xcode.
Теперь, если мы хотим добавить перечисление, создайте другое расширение для вашего автоматически сгенерированного класса и добавьте сюда свои определения перечисления, как показано ниже:
Теперь вы можете создавать собственные средства доступа, если хотите ограничить значения перечислением. Пожалуйста, проверьте принятый ответ владельцем вопроса . Или вы можете преобразовать свои перечисления, задав их явным методом преобразования, используя оператор приведения, как показано ниже:
Также проверьте
Автоматическое создание подкласса Xcode
источник