Swift Language Enums Raw and Hash values


Enums without payloads can have raw values of any literal type:

enum Rotation: Int {
    case up = 0
    case left = 90
    case upsideDown = 180
    case right = 270

Enums without any specific type do not expose the rawValue property

enum Rotation {
    case up
    case right
    case down
    case left

let foo = Rotation.up
foo.rawValue //error

Integer raw values are assumed to start at 0 and increase monotonically:

enum MetasyntacticVariable: Int {
    case foo  // rawValue is automatically 0
    case bar  // rawValue is automatically 1
    case baz = 7
    case quux  // rawValue is automatically 8

String raw values can be synthesized automatically:

enum MarsMoon: String {
    case phobos  // rawValue is automatically "phobos"
    case deimos  // rawValue is automatically "deimos"

A raw-valued enum automatically conforms to RawRepresentable. You can get an enum value's corresponding raw value with .rawValue:

func rotate(rotation: Rotation) {
    let degrees = rotation.rawValue

You can also create an enum from a raw value using init?(rawValue:):

let rotation = Rotation(rawValue: 0)  // returns Rotation.Up
let otherRotation = Rotation(rawValue: 45)  // returns nil (there is no Rotation with rawValue 45)

if let moon = MarsMoon(rawValue: str) {
    print("Mars has a moon named \(str)")
} else {
    print("Mars doesn't have a moon named \(str)")

If you wish to get the hash value of a specific enum you can access its hashValue, The hash value will return the index of the enum starting from zero.

let quux = MetasyntacticVariable(rawValue: 8)// rawValue is 8
quux?.hashValue //hashValue is 3