Swift Language
Przełącznik
Szukaj…
Parametry
Parametr | Detale |
---|---|
Wartość do przetestowania | Zmienna, z którą należy porównać |
Uwagi
Podaj skrzynkę dla każdej możliwej wartości wkładu. Użyj default case
aby zakryć pozostałe wartości wejściowe, których nie chcesz określać. Domyślny przypadek musi być ostatnim przypadkiem.
Domyślnie Przełączniki w Swift nie sprawdzają innych spraw po ich dopasowaniu.
Podstawowe użycie
let number = 3
switch number {
case 1:
print("One!")
case 2:
print("Two!")
case 3:
print("Three!")
default:
print("Not One, Two or Three")
}
Instrukcje switch działają również z typami danych innymi niż liczby całkowite. Działają z dowolnym typem danych. Oto przykład włączenia ciągu:
let string = "Dog"
switch string {
case "Cat", "Dog":
print("Animal is a house pet.")
default:
print("Animal is not a house pet.")
}
Spowoduje to wydrukowanie następujących elementów:
Animal is a house pet.
Dopasowywanie wielu wartości
Pojedynczy przypadek w instrukcji switch może być zgodny z wieloma wartościami.
let number = 3
switch number {
case 1, 2:
print("One or Two!")
case 3:
print("Three!")
case 4, 5, 6:
print("Four, Five or Six!")
default:
print("Not One, Two, Three, Four, Five or Six")
}
Dopasowanie zakresu
Pojedynczy przypadek w instrukcji switch może pasować do zakresu wartości.
let number = 20
switch number {
case 0:
print("Zero")
case 1..<10:
print("Between One and Ten")
case 10..<20:
print("Between Ten and Twenty")
case 20..<30:
print("Between Twenty and Thirty")
default:
print("Greater than Thirty or less than Zero")
}
Korzystanie z instrukcji where w przełączniku
Instrukcja where może być używana w dopasowaniu wielkości liter w celu dodania dodatkowych kryteriów wymaganych dla dopasowania dodatniego. Poniższy przykład sprawdza nie tylko zakres, ale także czy liczba jest nieparzysta czy parzysta:
switch (temperature) {
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
Spełnij jedno z wielu ograniczeń za pomocą przełącznika
Możesz utworzyć krotkę i użyć takiego przełącznika:
var str: String? = "hi"
var x: Int? = 5
switch (str, x) {
case (.Some,.Some):
print("Both have values")
case (.Some, nil):
print("String has a value")
case (nil, .Some):
print("Int has a value")
case (nil, nil):
print("Neither have values")
}
Częściowe dopasowanie
Instrukcja switch wykorzystuje częściowe dopasowanie.
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0): // 1
print("Origin")
case (_, 0, 0): // 2
print("On the x-axis.")
case (0, _, 0): // 3
print("On the y-axis.")
case (0, 0, _): // 4
print("On the z-axis.")
default: // 5
print("Somewhere in space")
}
- Dokładnie pasuje do przypadku, w którym wartość wynosi (0,0,0). To jest pochodzenie przestrzeni 3D.
- Dopasowuje y = 0, z = 0 i dowolną wartość x. Oznacza to, że współrzędna znajduje się na osi x.
- Dopasowuje x = 0, z = 0 i dowolną wartość y. Oznacza to, że współrzędna jest na osi.
- Dopasowuje x = 0, y = 0 i dowolną wartość z. Oznacza to, że współrzędna znajduje się na osi Z.
- Dopasowuje resztę współrzędnych.
Uwaga: użycie znaku podkreślenia oznacza, że nie zależy Ci na wartości.
Jeśli nie chcesz ignorować tej wartości, możesz użyć jej w instrukcji switch, tak jak poniżej:
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0):
print("Origin")
case (let x, 0, 0):
print("On the x-axis at x = \(x)")
case (0, let y, 0):
print("On the y-axis at y = \(y)")
case (0, 0, let z):
print("On the z-axis at z = \(z)")
case (let x, let y, let z):
print("Somewhere in space at x = \(x), y = \(y), z = \(z)")
}
W tym przypadku przypadki osi używają składni let do wyciągania odpowiednich wartości. Następnie kod drukuje wartości przy użyciu interpolacji łańcucha w celu zbudowania łańcucha.
Uwaga: w tej instrukcji switch nie potrzebujesz wartości domyślnej. Wynika to z tego, że ostatni przypadek jest zasadniczo domyślny - pasuje do wszystkiego, ponieważ nie ma żadnych ograniczeń na żadnej części krotki. Jeśli instrukcja switch wyczerpuje wszystkie możliwe wartości wraz ze swoimi przypadkami, wówczas nie jest wymagana żadna wartość domyślna.
Możemy również użyć składni let-where, aby dopasować bardziej złożone przypadki. Na przykład:
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (let x, let y, _) where y == x:
print("Along the y = x line.")
case (let x, let y, _) where y == x * x:
print("Along the y = x^2 line.")
default:
break
}
Tutaj dopasowujemy linie „y równa się x” i „y równa się x kwadrat”.
Przełącz upadki
Warto zauważyć, że w szybkim, w przeciwieństwie do innych języków, z którymi ludzie są zaznajomieni, na końcu każdej instrukcji przypadku występuje ukryta przerwa. Aby przejść do następnej sprawy (tj. fallthrough
wiele spraw), musisz użyć instrukcji fallthrough
.
switch(value) {
case 'one':
// do operation one
fallthrough
case 'two':
// do this either independant, or in conjunction with first case
default:
// default operation
}
jest to przydatne w przypadku strumieni.
Switch and Enums
Instrukcja Switch działa bardzo dobrze z wartościami Enum
enum CarModel {
case Standard, Fast, VeryFast
}
let car = CarModel.Standard
switch car {
case .Standard: print("Standard")
case .Fast: print("Fast")
case .VeryFast: print("VeryFast")
}
Ponieważ podaliśmy przypadek dla każdej możliwej wartości samochodu, pomijamy przypadek
default
.
Przełącznik i opcje
Niektóre przykładowe przypadki, w których wynik jest opcjonalny.
var result: AnyObject? = someMethod()
switch result {
case nil:
print("result is nothing")
case is String:
print("result is a String")
case _ as Double:
print("result is not nil, any value that is a Double")
case let myInt as Int where myInt > 0:
print("\(myInt) value is not nil but an int and greater than 0")
case let a?:
print("\(a) - value is unwrapped")
}
Przełączniki i krotki
Przełączniki mogą włączać krotki:
public typealias mdyTuple = (month: Int, day: Int, year: Int)
let fredsBirthday = (month: 4, day: 3, year: 1973)
switch theMDY
{
//You can match on a literal tuple:
case (fredsBirthday):
message = "\(date) \(prefix) the day Fred was born"
//You can match on some of the terms, and ignore others:
case (3, 15, _):
message = "Beware the Ides of March"
//You can match on parts of a literal tuple, and copy other elements
//into a constant that you use in the body of the case:
case (bobsBirthday.month, bobsBirthday.day, let year) where year > bobsBirthday.year:
message = "\(date) \(prefix) Bob's \(possessiveNumber(year - bobsBirthday.year))" +
"birthday"
//You can copy one or more elements of the tuple into a constant and then
//add a where clause that further qualifies the case:
case (susansBirthday.month, susansBirthday.day, let year)
where year > susansBirthday.year:
message = "\(date) \(prefix) Susan's " +
"\(possessiveNumber(year - susansBirthday.year)) birthday"
//You can match some elements to ranges:.
case (5, 1...15, let year):
message = "\(date) \(prefix) in the first half of May, \(year)"
}
Dopasowywanie w oparciu o klasę - idealne do przygotowaniaForSegue
Możesz także dokonać przełączenia instrukcji switch na podstawie klasy włączanej rzeczy.
Przykład, w którym jest to przydatne, znajduje się w prepareForSegue
. Kiedyś przełączałem na podstawie identyfikatora segue, ale to kruche. jeśli później zmienisz scenorys i zmienisz nazwę identyfikatora segue, spowoduje to uszkodzenie kodu. Lub, jeśli używasz sekwencji dla wielu instancji tej samej klasy kontrolera widoku (ale różnych scen serii ujęć), nie możesz użyć identyfikatora segue, aby obliczyć klasę miejsca docelowego.
Szybkie instrukcje przełączników na ratunek.
Używaj Swift case let var as Class
składni case let var as Class
, jak poniżej:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}
W Swift 3 sytax nieznacznie się zmienił:
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}