[iphone] Лучший способ реализации Enums с базовыми данными



Answers

Вы можете сделать это, проще:

typedef enum Types_e : int16_t {
    TypeA = 0,
    TypeB = 1,
} Types_t;

@property (nonatomic) Types_t itemType;

И в вашей модели установите для параметра itemType значение 16 бит. Все сделано. Дополнительного кода не требуется. Просто положите свой обычный

@dynamic itemType;

Если вы используете Xcode для создания подкласса NSManagedObject , убедитесь, что установлен параметр « Использовать скалярные свойства для примитивных типов данных ».

Question

Каков наилучший способ привязать объекты Core Data к значениям перечисления, чтобы я мог назначить свойство типа для объекта? Другими словами, у меня есть объект под названием Item с свойством itemType который я хочу itemType к перечислению, что лучше всего подходит для этого.




Поскольку перечисления поддерживаются стандартным коротким, вы также не можете использовать обертку NSNumber и напрямую устанавливать свойство как скалярное значение. Не забудьте установить тип данных в базовой модели данных как «Целое число 32».

MyEntity.h

typedef enum {
kEnumThing, /* 0 is implied */
kEnumWidget, /* 1 is implied */
} MyThingAMaBobs;

@interface myEntity : NSManagedObject

@property (nonatomic) int32_t coreDataEnumStorage;

В другом месте кода

myEntityInstance.coreDataEnumStorage = kEnumThing;

Или синтаксический анализ из строки JSON или загрузка из файла

myEntityInstance.coreDataEnumStorage = [myStringOfAnInteger intValue];



Если вы используете mogenerator, посмотрите на это: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . У вас может быть атрибут Integer 16, называемый itemType , с атрибутом itemType Item в информации о пользователе. Затем в пользовательской информации для вашего объекта установите additionalHeaderFileName имяHeaderFileName в имя заголовка, в котором определено перечисление Item . При генерации ваших файлов заголовков, movenerator автоматически сделает свойство имеющим тип Item .




Я много сделал и нашел следующую форму:

// accountType
public var account:AccountType {
    get {
        willAccessValueForKey(Field.Account.rawValue)
        defer { didAccessValueForKey(Field.Account.rawValue) }
        return primitiveAccountType.flatMap { AccountType(rawValue: $0) } ?? .New }
    set {
        willChangeValueForKey(Field.Account.rawValue)
        defer { didChangeValueForKey(Field.Account.rawValue) }
        primitiveAccountType = newValue.rawValue }}
@NSManaged private var primitiveAccountType: String?

В этом случае перечисление довольно просто:

public enum AccountType: String {
    case New = "new"
    case Registered = "full"
}

и называть его педантичным, но я использую перечисления для имен полей, например:

public enum Field:String {

    case Account = "account"
}

Поскольку это может стать трудоемким для сложных моделей данных, я написал генератор кода, который потребляет MOM / сущности, чтобы выплевывать все сопоставления. Мои входы в конечном итоге являются словарем из типа Table / Row to Enum. Пока я был на нем, я также создал код сериализации JSON. Я сделал это для очень сложных моделей, и это оказалось большой экономией времени.




Links