Swift: сохранение состояний в CoreData с перечислениями

30

Я хочу сохранить состояние перечисления для управляемого объекта в CoreData​​p >

enum ObjStatus: Int16 {
    case State1 = 0
    case State2 = 1
    case State3 = 3
}

class StateFullManagedObject: NSManagedObject {
    @NSManaged var state: Int16
}

Последним шагом будет преобразование состояния var StateFullManagedObject в ObjStatus для прямого сравнения, которое не работает для меня. Например, я не могу использовать оператор == между Int16 и Int16 перечислением. Ошибка времени компиляции, которую я получаю,

Int16 не конвертируется в 'MirrorDisposition'

. См. Условное обозначение ниже:

var obj: StateFullManagedObject = // get the object

if (obj.state == ObjStatus.State1) { // Int16 is not convertible to 'MirrorDisposition'

}

Как я могу сравнивать/назначать между Int16 и перечислением?

Теги:
core-data

2 ответа

34
Лучший ответ

Вы можете извлечь значение raw Int16 с помощью свойства .rawValue ObjStatus.

// compare
obj.state == ObjStatus.State1.rawValue

// store
obj.state = ObjStatus.State1.rawValue

Но вам может понадобиться реализовать stateEnum accessor для него:

class StateFullManagedObject: NSManagedObject {
    @NSManaged var state: Int16
    var stateEnum:ObjStatus {                    //  ↓ If self.state is invalid.
        get { return ObjStatus(rawValue: self.state) ?? .State1 }
        set { self.state = newValue.rawValue }
    }
}

// compare
obj.stateEnum == .State1

// store
obj.stateEnum = .State1

// switch
switch obj.stateEnum {
case .State1:
    //...
case .State2:
    //...
case .State3:
    //...
}
  • 4
    Да, это в значительной степени то, что я делаю. Я добавляю суффикс атрибута основных данных к «Raw», а затем получаю вычисляемое свойство с правильным именем, которое относится к переводу из enum в raw int.
  • 1
    Это очень чистое и красивое быстрое решение! Спасибо!!
Показать ещё 1 комментарий
44

Вы можете объявить свое перечисление как @objc. Затем все это автоматически работает. Вот фрагмент проекта, над которым я работаю.

// Defined with @objc to allow it to be used with @NSManaged.
@objc enum AgeType: Int32
{
    case Age                = 0
    case LifeExpectancy     = 1
}

/// The age type, either Age or LifeExpectancy.
@NSManaged var ageType: AgeType

В модели Core Data ageType устанавливается для ввода Integer 32.

  • 0
    Это намного более чистая реализация. Спасибо!
  • 0
    Определенно лучшее решение. Нет необходимости в частных дублирующих полях, преобразователях и т. Д.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню