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 // 0Połą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.
Wyzwanie
ŁatwyZdefiniuj 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ćsjakoIntlub 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
3Spróbuj swoich sił
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// dla każdego part, (try? parseEven(part)) ?? -1
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
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słów3Słowniki
Deklarowanie słownikówWyszukiwanie opcjonalneAktualizowanie słownikówIterowanie po słownikachGrupowanie wartościPodsumowanie – inwentarz6Funkcje wyższego rzędu, cz. 2
compactMapflatMapsorted(by:)Tworzenie potokówPowtórzenie – tabela wyników9Obsługa błędów
throws i Errordo, try, catchtry? i try!Przekazywanie błędówPowtórka — bezpieczny kalkulatorPoćwicz samodzielnie: Edytor online Swift