Menu
Coddy logo textTech

Énumérations avec méthodes

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 15 sur 57.

Un enum définit un type avec un ensemble fixe de cas. Les valeurs s’écrivent avec un point, et switch doit gérer chaque cas ; ainsi, l’ajout ultérieur d’un cas indique tous les endroits à mettre à jour :

enum Direction {
    case north, east, south, west
}

let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}

Sortie :

right

Les énumérations peuvent avoir des méthodes et des propriétés calculées. À l’intérieur de celles-ci, self désigne le cas courant :

enum Direction {
    case north, east, south, west

    var turnedRight: Direction {
        switch self {
        case .north: return .east
        case .east: return .south
        case .south: return .west
        case .west: return .north
        }
    }
}

print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)

Résultat :

east
east

Une valeur brute associe une valeur fixe d’un type à chaque cas. init(rawValue:) fait l’inverse et renvoie nil lorsqu’aucun cas ne correspond :

enum Size: String {
    case small = "S", medium = "M", large = "L"
}

print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)

Sortie :

M
true
true

Les valeurs associées permettent à chaque cas de contenir ses propres données, ce qui permet à un même type de contenir des valeurs de formes différentes. switch lie les données avec let :

enum Payment {
    case cash(amount: Int)
    case card(number: String, amount: Int)

    var amount: Int {
        switch self {
        case .cash(let amount): return amount
        case .card(_, let amount): return amount
        }
    }
}

let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })

Sortie :

[20, 55]
challenge icon

Défi

Facile

Complétez l’énumération Command avec les cas forward, back, left et right, associés aux valeurs brutes F, B, L et R. Ajoutez une propriété calculée step qui renvoie la variation de la position : forward 1, back -1, left et right 0. Complétez ensuite run(_:), qui transforme chaque caractère en commande avec init(rawValue:) (en ignorant les caractères inconnus) et renvoie position 2, turns 1, skipped 1.

Le code fourni lit une ligne de lettres de commande et affiche le résultat de run(_:).

Votre code doit se trouver dans Command.swift et Functions.swift. main.swift contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

// Code d'entrée/sortie fourni : le garder tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Swift