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:
rightTypy 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
eastWartość 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
trueWartoś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]Wyzwanie
ŁatwyUzupeł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]))
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Właściwości w szczegółach
Właściwości obliczaneObserwatory właściwościElementy statyczneTypy wyliczeniowe z metodamiPodsumowanie – rejestr temperaturyPoćwicz samodzielnie: Edytor online Swift