Storing a Swift Enum in Core Data

You must do the following to store a Swift enum in Core Data:

  • Create an enum with a raw value with a type Core Data can store, such as an integer or a string.
  • Add an attribute for the enum to the Core Data entity. Set the attribute’s type to the raw value type.
  • Add a computed property to the entity to convert the enum to and from the attribute’s raw value.

Creating the Enum

Core Data has no way of knowing your enum. That’s why you must give your enum a raw value type. Supplying a raw value type lets Core Data store the enum value.

The following code shows an enum for issue priorities whose raw value type is an integer:

enum IssuePriority: Int {
  case low = 1
  case medium = 2
  case high = 3
}

Core Data will save the integer values of the issue priorities.

Adding the Computed Property

Adding a computed property to the Core Data entity allows you to use the Swift enum in your code. The usual way to add a computed property is to create an extension for the Core Data entity type.

The computed property requires a getter and a setter. The getter creates an enum value from its raw value. The setter sets the raw value for the enum value.

The next example shows an Issue entity with a priorityLevel attribute of type Int64. The following code creates a computed property for the issue priority:

extension Issue {
  var priority: IssuePriority {
    get {
      return IssuePriority(rawValue: Int(self.priorityLevel)) ?? .low
    }
    set {
      self.priorityLevel = Int64(newValue.rawValue)
    }
  }
}

Now you can use the priority property to set issue priorities using the enum values.

When writing the setter make sure to use the same data type as the attribute in the Core Data model, Int64 in the example.

Get the Swift Dev Journal Newsletter

Subscribe and get exclusive articles, a free guide on moving from tutorials to making your first app, notices of sales on books, and anything I decide to add in the future.

    We won't send you spam. Unsubscribe at any time.