L'exemple que nous allons utiliser dessous définit une structure appelée BlackjackCard qui représente un jeu de cartes. Sa structure contient deux énumérations imbriquées appelées Suit et Rank. Au blackjack l'as a une valeur de 1 ou de 11. Cette particularité est représentée par une structure appelée Values qui est imbriquée à l'intérieur de l'énumération Rank :
struct BlackjackCard {
// Enumération imbriquée : Suit
enum Suit: Character {
case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
}
// Enumération imbriquée : Rank
enum Rank: Int {
case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King, Ace
// Structure imbriquée : Values
struct Values {
let first: Int, second: Int?
}
var values: Values {
switch self {
case .Ace:
return Values(first: 1, second: 11)
case .Jack, .Queen, .King:
return Values(first: 10, second: nil)
default:
return Values(first: self.rawValue, second: nil)
}
}
}
// Propriétés et méthodes du BlackjackCard
let rank: Rank, suit: Suit
var description: String {
var output = "suit is \(suit.rawValue),"
output += " value is \(rank.values.first)"
if let second = rank.values.second {
output += " or \(second)"
}
return output
}
}
L'énumération Suit décrit les quatre couleurs de cartes avec le Character comme valeur pour les représenter. L'énumération Rank lui, définit les treize valeurs possibles sous forme d'entiers. Comme mentionné avant, la structure Rank contient une structure imbriquée appelée Rank. Cette structure encapsule le fait que des cartes puissent avoir 2 valeurs.
Comme BlackjackCard est une structure sans initialiser personnalisé, il utilise un initialiser implicite basé sur ses membres. Vous pouvez utiliser cet initialiser pour créer une nouvelle constante appelée theAceOfSpades :
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// Affiche : "theAceOfSpades: suit is â™ , value is 1 or 11"
Même si Rank et Suit sont des types imbriqués à l'intérieur de BlackjackCard, leur type peut être inféré de leur contexte et donc l'initialiser de cette instance est capable d'utiliser les énumérations uniquement par les noms des cas (.Ace et .Spades).
Références aux types imbriqués
Pour utiliser un type imbriqué en-dehors de son contexte de définition il faut préfixer son nom avec le nom du type dans lequel il est imbriqué :
let heartsSymbol = BlackjackCard.Suit.Hearts.rawValue
// heartsSymbol est "♡"