Я хочу сохранить состояние перечисления для управляемого объекта в CoreDatap >
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 и перечислением?
Вы можете извлечь значение 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:
//...
}
Вы можете объявить свое перечисление как @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.