Enum é um tipo definido no Swift que representa um grupo de valores e permite sua manipulação de uma forma segura ao contar com todas as características que tipagem nos oferece.
Vamos definir no exemplo, uma enum Estado com dois valores: ON e OFF para um botão:
enum Estado {
    case ON
    case OFF
}
Agora, podemos fazer uma função usa esse Estado para algo:
func botao(estado: Estado) {
    if(estado == .ON) {
        print("Botão ligado")
    } else {
        print("Botão desligado")
    }
}
Veja que para sabermos qual o Estado que foi passado para a função temos um if(estado == .ON). Esse .ON pode ser escrito como Estado.ON e é justamente um dos valores que definimos na enum.
Então, ao fazermos
botao(estado: .OFF)
//ou botao(estado: Estado.OFF)
teremos a seguinte saída:
Botão desligado
Podemos passar a própria enum no print. Neste caso, veja como ficará:
func botao(estado: Estado) {
    print("Botão \(estado)")
}
Agora, ao chamarmos botao(estado: .OFF), teremos:
Botão OFF
Veja que por padrão, o nome que damos aos valores da enum viram uma string que pode ser usada em prints, por exemplo.
Podemos também customizar essa string associada aos nossos valores:
enum Estado : String {
    case ON = "ligado"
    case OFF = "desligado"
}
E usá-la na nossa função por meio do método rawValue:
func botao(estado: Estado) {
    print("Botão \(estado.rawValue)")
}
Agora, ao fazemos...
botao(estado: .OFF)
Teremos...
Botão desligado
Veja que agora, não temos o if/else e nossa função continua devolvendo a mesma saída que o primeiro exemplo. A diferença é que usamos melhor a enum.