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")
}
  1. Dokładnie pasuje do przypadku, w którym wartość wynosi (0,0,0). To jest pochodzenie przestrzeni 3D.
  2. Dopasowuje y = 0, z = 0 i dowolną wartość x. Oznacza to, że współrzędna znajduje się na osi x.
  3. Dopasowuje x = 0, z = 0 i dowolną wartość y. Oznacza to, że współrzędna jest na osi.
  4. Dopasowuje x = 0, y = 0 i dowolną wartość z. Oznacza to, że współrzędna znajduje się na osi Z.
  5. 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:

3.0
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
  }
}
3.0

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow