22 luty

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

  • 1 / Tutaj tworzę stałą string
  • 2 / Zmienna string, którą będziemy nadpisywać w switch'u
  • 3 / Wartość stringu się zgadza, ale dodałem "where" które również sprawdza wartość podaną dalej
  • 4 / Można wymienić po przecinku kilka wartości i jeśli którakolwiek się zgadza switch wejdzie w dany case
  • 5 / Zła wartość podana więc case również zostanie pominięty
  • 6 / Zamiast podania wartości można dać kreskę dolną która oznacza, że niezależnie od tej wartości powinien wejść w dany case
  • 7 / 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: ()
  }

  • 1 / Kolejna zmienna z wartością string, ale zadeklarowaną jako opcjonalny obiekt Any
  • 2 / Sprawdzanie czy text jest nilem i dalej za "where" sprawdzenie czy dany obiekt jest Int’em
  • 3 / 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
  }

  • 1 / W przypadku takiego zapisu switch będzie sprawdzał obie stałe
  • 2 / W ten sposób można obsłużyć kilka przypadków na raz w jednym warunku
  • 3 / Słowo "fallthrough" oznacza przejście do kolejnego warunku czyli, jeśli (a, b) == (1, 2) przejdzie do kolejnego spełnionego warunku
  • 4 / W takim przypadku switch będzie sprawdzał tylko pierwszą wartość i całkowicie pominie drugą
  • 5 / Switch będzie sprawdzał tylko drugą wartość a z pierwszej stworzy stałą, w tym przypadku o nazwie “aValue”
  • 6 / 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
  • 7 / 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: ()
  }

  • 1 / Deklaracja enum’u z 3 wartościami, pierwsza bez parametrów, druga i trzecia z jednym parametrem i czwarta z dwoma parametrami
  • 2 / Stworzenie stałej z dwoma parametrami
  • 3 / Sprawdzanie czy stała jest równa .noParameters
  • 4 / Sprawdzenie czy stała jest równa .oneParameter i pominięcie wartości
  • 5 / Sprawdzenie czy stała jest równa .anotherOneParameter dająca możliwość dostępu do parametrów
  • 6 / 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.