Menu
Coddy logo textTech

Typy wyliczeniowe z metodami

Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 15 z 57.

enum definiuje typ o stałym zestawie przypadków. Wartości zapisuje się z kropką, a switch musi obsługiwać każdy przypadek, więc dodanie kolejnego przypadku pozwala znaleźć każde miejsce, które wymaga aktualizacji:

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")
}

Wynik:

right

Typy wyliczeniowe mogą mieć metody i właściwości obliczane. W ich wnętrzu self oznacza bieżący przypadek:

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)

Wynik:

east
east

Wartość surowa przypisuje każdemu przypadkowi stałą wartość jednego typu. init(rawValue:) działa w drugą stronę i zwraca nil, gdy żaden przypadek nie pasuje:

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

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

Wynik:

M
true
true

Wartości powiązane pozwalają każdemu przypadkowi przechowywać własne dane, dzięki czemu jeden typ może przechowywać wartości o różnej strukturze. switch wiąże dane za pomocą 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 })

Wynik:

[20, 55]
challenge icon

Wyzwanie

Łatwy

Uzupełnij enum Command przypadkami forward, back, left i right, opartymi na wartościach surowych F, B, L i R. Dodaj obliczaną właściwość step, która zwraca zmianę pozycji: dla forward 1, dla back -1, a dla left i right 0. Następnie uzupełnij run(_:), która zamienia każdy znak na komendę za pomocą init(rawValue:) (pomijając nieznane znaki) i zwraca position 2, turns 1, skipped 1.

Dostarczony kod odczytuje jeden wiersz liter komend i wyświetla wynik działania run(_:).

Twój kod umieść w plikach Command.swift i Functions.swift. Plik main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Swift