Swift Language Valores crudos y hash


Ejemplo

Las enumeraciones sin carga útil pueden tener valores sin procesar de cualquier tipo literal:

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

Las enumeraciones sin ningún tipo específico no exponen la propiedad rawValue

enum Rotation {
    case up
    case right
    case down
    case left
}

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

Se asume que los valores brutos enteros comienzan en 0 y aumentan monótonamente:

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

Los valores en bruto de la cadena se pueden sintetizar automáticamente:

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

Una enumeración en bruto se ajusta automáticamente a RawRepresentable . Puede obtener el valor bruto correspondiente de un valor de enumeración con .rawValue :

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

También puede crear una enumeración a partir de un valor en bruto usando 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)")
}

Si desea obtener el valor de hash de una enumeración específica, puede acceder a su valor de hash, el valor de hash devolverá el índice de la enumeración comenzando desde cero.

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