Définition

Comme son nom l’indique, l’énumération permet de grouper et énumérer des valeurs de façon sûre dans votre code. Chaque élément d’une énumération est un cas.

En Swift, il n’est pas obligatoire de donner une valeur à chacun des cas. Les valeurs peuvent être de différents types (Int, Double, Float, String, Character).

Syntaxe

Une Enumération ressemble dans sa construction à une classe ou une structure et se définit par un mot clé ‘enum’. Ce mot clé est suivi de du nom de l’Enum, selon la même convention que les classes (Commence par une majuscule) et les cas sont énumérés entre accolades. Chaque cas est introduit par le mot clé case

enum UserType {
    case admin
    case visitor
    case freeUser
    case paidUser
} 

Vous pouvez aussi énumérer les cas sur une ligne simple. Dans ce cas, le mot clé apparaîtra au début, et chaque cas sera séparé par une virgule.

enum Media {
    case photo, link, video, gif
} 

Utilisation d'un Enum

Si le type n’est pas défini, vous devrez utiliser le nom de l’enum, suivi d’un point et du cas.

var user = UserType.freeUser 

Si le type est défini, le point suivi du cas suffira.

var user: UserType = .freeUser 

Switch et Enum

Lorsque nous avons vu les switch, nous devions donner une valeur par défault, si aucun des cas ne correspondait. Avec les Enum, si nous passons en revue tous les cas, le défaut ne sera pas obligatoire, car notre déclaration sera exhaustive.

switch media {
case .photo: print(“Vous avez ajouté une vidéo”)
case .link: print(“Voici le lien vers un site”)
case .gif: print(“J’adore les gifs”)
case .video: print(“Sortez le pop corn”)
} 

Par contre, si nous n’enumérons pas tous les cas, une valeur par défaut sera obligatoire.

Raw Values

Il est possible d’attribuer des valeurs à chaque cas. Pour ceci, il faut définir le type de valeur après le nom de l’enum et associer une valeur correspondante au type à chaque cas.

enum UserType: String {
    case admin = “Administrateur”
    case visitor = “Visiteur”
    case freeUser = “Utilisateur gratuit”
    case paidUser = “Utilisateur payant”
}
let newUser = UserType.paidUser.rawValue
print(newUser)
//Utilisateur payant
 

RawValues implicites

Lorsque nous voulons associer des rawValues à des Int ou des String, nous ne sommes pas obligés de donner une valeur à chaque cas, elles sont implicitement crées.

enum UserType: String {
    case admin
    case visitor
    case freeUser
    case paidUser
}
let newUser = UserType.paidUser.rawValue
print(newUser)
//paidUser 

Pour les Int, la rawValue sera comme l’index d’un array, il commencera de 0 (sauf explicitement défini autrement). Pour les String, nous aurons le nom du cas en String.

enum Media: Int {
    case photo, link, video, gif
}
let mediaChosen = Media.link
print(mediaChosen.rawValue)
//1. L’index de link est 1
enum Media: Int {
    case photo = 4, link, video, gif
}
let mediaChosen = Media.link
print(mediaChosen.rawValue)
//5 

Initialiser une RawValue

Si vous énumérer possède un rawValue, il est possible d’initialiser un cas par rapport à sa rawValue.

Cependant, vous aurez une valeur optionnelle et peut être nil.

enum Media: Int {
    case photo, link, video, gif
}
let mediaToFind = Media(rawValue: 2)if mediaToFind != nil {
    print(“Nous avons trouvé”)
} 

Le CaseIterable

Pour certaines énumérations, il peut être très utile d’avoir une collection de tous les cas. Pour ceci, il faut ajouter ‘: CaseIterable’ entre le nom de l’enum et les accolades. 

Ce : CaseIterable est un protocole. Nous parlerons des protocoles plus loin dans la documentation.

Ensuite, un simple nom de l’enum suivi de ‘.allCases’ permet de récupérer tout cet enum sous forme de collection.

enum UserType: String, CaseIterable {
    case admin
    case visitor
    case freeUser
    case paidUser
}
let allTypes = UserType.allCases
allTypes.forEach { (type) in
    print(type.rawValue)
}
/*
 admin
 visitor
 freeUser
 paidUser
 */