web-dev-qa-db-fra.com

Swift: Stockage des états dans Core Data avec des énumérations

Je souhaite stocker un état d'énumération pour un objet géré dans CoreData

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

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

La dernière étape serait de convertir l'état var de StateFullManagedObject en ObjStatus pour une comparaison directe, ce qui ne fonctionne pas pour moi. Par exemple, je ne peux pas utiliser l'opérateur == entre et Int16 et l'énumération Int16. L'erreur de compilation que j'obtiens est

Int16 n'est pas convertible en "MirrorDisposition"

. Voir le conditionnel ci-dessous:

var obj: StateFullManagedObject = // get the object

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

}

Comment puis-je comparer/affecter entre un Int16 et une énumération?

44
kev

Vous pouvez extraire la valeur brute Int16 Avec la propriété .rawValue De ObjStatus.

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

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

Mais vous voudrez peut-être implémenter l'accessoire stateEnum:

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:
    //...
}
47
rintaro

Vous pouvez déclarer votre énumération comme @objc. Ensuite, tout cela fonctionne automatiquement. Voici un extrait d'un projet sur lequel je travaille.

// 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

Dans le modèle Core Data, ageType est défini sur type Integer 32.

68
Mark Krenek