Menu
Coddy logo textTech

try? i try!

Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 46 z 56.

Czasami nie ma znaczenia, jaki błąd zgłosiła funkcja — chcesz po prostu otrzymać wynik albo wartość zastępczą. Swift oferuje dwie krótkie formy.

try? zamienia każdy zgłoszony błąd na nil. Wynikiem jest wartość typu Optional typu zwracanego przez funkcję:

enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }

let result = try? risky()        // nil
let safe   = (try? risky()) ?? 0 // 0

Połącz to z ??, aby ustawić wartość domyślną w tym samym wierszu. To najkrótsza wersja „wywołaj to i zwróć mi wartość w każdym przypadku”.

try! mówi: „Wiem, że to nie spowoduje błędu”. Jeśli jednak go spowoduje, program ulegnie awarii. Używaj go tylko wtedy, gdy możesz udowodnić, że wywołanie jest bezpieczne; w codziennym kodzie lepiej używać try? z wartością zastępczą albo pełnej konstrukcji do/catch.

challenge icon

Wyzwanie

Łatwy

Zdefiniuj NumError: Error z jednym przypadkiem bad. Zdefiniuj funkcję parseEven(_ s: String) throws -> Int, która zgłasza błąd i:

  • Zgłasza .bad, gdy nie można sparsować s jako Int lub gdy sparsowana wartość jest nieparzysta
  • W przeciwnym razie zwraca sparsowaną liczbę całkowitą

Odczytaj jeden wiersz wejścia: listę ciągów znaków rozdzielonych przecinkami. Dla każdego z nich użyj try?, a następnie ?? -1, aby otrzymać sparsowaną parzystą liczbę całkowitą albo -1.

Wypisz kolejno uzyskane liczby całkowite, połączone za pomocą ,. Następnie w drugim wierszu wypisz liczbę wartości, które zwróciły -1.

Dla wejścia 4,7,abc,8,11,2 wynikiem jest:

4,-1,-1,8,-1,2
3

Spróbuj swoich sił

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// dla każdego part, (try? parseEven(part)) ?? -1
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Edytor online Swift