Swift switch, czyli zabawa warunkami

Chciałbym, abyś zaprzyjaźnił się z instrukcją warunkową switch w Swifcie, opierając się na metodzie gumowej kaczki. Zakładam, że masz już pojęcie jak działa instrukcja switch, w związku z tym pokażę co nowego w Swifcie.
Najczęściej używany przykład
Tutaj pokażę kawałek kodu, który opiszę w kolejnym paragrafie.
let string = "Hello, playground" //1
let value = false
var endString: String //2
switch string {
case "Hello, playground" where value: //3
endString = "case one with value"
case "a", "b", "c": //4
endString = "case with 3 values"
case "Goodbye playgrand": //5
endString = "Goodbye"
case _ where !value: //6
endString = "Yo!"
default: //7
endString = "default"
}
- Tutaj tworzę stałą string.
- Zmienna string, którą będziemy nadpisywać w switch’u.
- Wartość stringu się zgadza, ale dodałem “where” które również sprawdza wartość podaną dalej.
- Można wymienić po przecinku kilka wartości i jeśli którakolwiek się zgadza switch wejdzie w dany case.
- Zła wartość podana, więc case również zostanie pominięty.
- Zamiast podania wartości można dać kreskę dolną która oznacza, że niezależnie od tej wartości powinien wejść w dany case.
- Słowo: “default” oznacza, że wejdzie jeśli wszystkie inne wartości się nie zgadzają.
Optionale
let text = "Text" as AnyObject? //1
switch text {
case let text? where text is Int: //2
print(text as! Int)
case let text? where text is String: //3
print(text as! String)
default: ()
}
- Kolejna zmienna z wartością string, ale zadeklarowaną jako opcjonalny obiekt Any.
- Sprawdzanie czy text jest nilem i dalej za “where” sprawdzenie czy dany obiekt jest Int’em.
- Sprawdzanie czy text jest nilem i dalej za “where” sprawdzenie czy dany obiekt jest String’iem.
Inty
let a = 1
let b = 2
var c = 0
switch (a, b) { //1
case (1, 2), (2, 3): //2
c = 12
fallthrough //3
case (2,_): //4
c += 1
case (let aValue, 2): //5
print("a = \(aValue)")
case (let eitherValue, 2), (2, let eitherValue): //6
print("either value: \(eitherValue)")
case (0...3, 0...100): //7
c += 5
fallthrough
default:
c = 17
}
- W przypadku takiego zapisu switch będzie sprawdzał obie stałe.
- W ten sposób można obsłużyć kilka przypadków na raz w jednym warunku.
- Słowo “fallthrough” oznacza przejście do kolejnego warunku czyli, jeśli (a, b) == (1, 2) przejdzie do kolejnego spełnionego warunku.
- W takim przypadku switch będzie sprawdzał tylko pierwszą wartość i całkowicie pominie drugą.
- Switch będzie sprawdzał tylko drugą wartość a z pierwszej stworzy stałą, w tym przypadku o nazwie “aValue”.
- Tutaj chciałem pokazać, że wartości można tworzyć z różnych parametrów, czyli w pierwszym przypadku z pierwszej wartości a w drugim z drugiej wartości.
- Ten przypadek pokazuje użycie przedziałów liczbowych, tutaj switch sprawdzi czy pierwsza wartość będzie w przedziale od 0 do 3 a druga od 0 do 100.
Enumy
enum Cases { //1
case noParameters
case oneParameter(text: String)
case anotherOneParameter(firstText: String)
case twoParameters(text: String, number: Int)
}
let thisCase: Cases = .twoParameters(text: "Text", number: 10) //2
switch thisCase {
case .oneParameter(_): //4
break
case .anotherOneParameter(let text): //5
print("Text: \(text)")
case let .twoParameters(text, number): //6
print("Text: \(text)")
print("Number: \(number)")
default: ()
}
- Deklaracja enum’u z 3 wartościami, pierwsza bez parametrów, druga i trzecia z jednym parametrem i czwarta z dwoma parametrami
- Stworzenie stałej z dwoma parametrami
- Sprawdzanie czy stała jest równa .noParameters
- Sprawdzenie czy stała jest równa .oneParameter i pominięcie wartości
- Sprawdzenie czy stała jest równa .anotherOneParameter dająca możliwość dostępu do parametrów
- To samo co w punkcie 5 tylko słowo “let” jest teraz przed nazwą dzięki czemu nie trzeba pisać przed każdym parametrem
Kod wykorzystany w tym artykule znajduje się na naszym GitHubie.