try? und try!
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 46 von 56.
Manchmal ist es Ihnen egal, welchen Fehler eine Funktion ausgelöst hat, Sie möchten einfach nur ein Ergebnis oder einen Fallback. Swift bietet Ihnen zwei Kurzformen.
try? wandelt jeden geworfenen Fehler in nil um. Das Ergebnis ist ein Optional des Rückgabetyps der Funktion:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Kombinieren Sie es mit ?? für einen Inline-Standardwert. Dies ist die kürzeste Version von „rufe dieses Ding auf, gib mir in jedem Fall einen Wert“.
try! besagt: „Ich weiß, dass dies keinen Fehler auslösen wird“. Wenn es das doch tut, stürzt Ihr Programm ab. Verwenden Sie es nur, wenn Sie beweisen können, dass der Aufruf sicher ist; bevorzugen Sie im alltäglichen Code try? mit einem Fallback oder das vollständige do/catch.
Aufgabe
EinfachDefiniere NumError: Error mit einem Case bad. Definiere eine throwing Function parseEven(_ s: String) throws -> Int, die:
.badwirft, wennsnicht alsIntgeparst werden kann oder wenn der geparste Wert ungerade ist- Andernfalls den geparsten Integer zurückgibt
Lies eine einzelne Eingabezeile ein: eine durch Kommas getrennte Liste von Strings. Verwende für jeden String try? gefolgt von ?? -1, um entweder den geparsten geraden Integer oder -1 zu erhalten.
Gib nacheinander die resultierenden Integer aus, verbunden durch ,. Gib dann in einer zweiten Zeile die Anzahl der Werte aus, die als -1 zurückgegeben wurden.
Für die Eingabe 4,7,abc,8,11,2 lautet die Ausgabe:
4,-1,-1,8,-1,2
3Spickzettel
try? wandelt einen geworfenen Fehler in nil um und gibt ein Optional zurück:
let result = try? risky() // nil bei Fehler
let safe = (try? risky()) ?? 0 // Fallback-Werttry! führt zu einem Absturz, wenn der Aufruf einen Fehler wirft — verwenden Sie dies nur, wenn der Aufruf garantiert sicher ist:
let value = try! guaranteedSafe()Probier es selbst
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// für jeden part, (try? parseEven(part)) ?? -1
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken3Dictionaries
Dictionaries deklarierenOptionaler LookupDictionaries aktualisierenÜber Dictionaries iterierenWerte gruppierenZusammenfassung – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenZusammenfassung – Bestenliste9Fehlerbehandlung
throws und Errordo, try, catchtry? und try!Fehler weitergebenZusammenfassung – Sicherer Taschenrechner