try? und try!
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 46 von 56.
Manchmal ist dir egal, welchen Fehler eine Funktion ausgelöst hat; du möchtest einfach ein Ergebnis oder einen Fallback. Swift bietet dir dafür zwei Kurzformen.
try? wandelt jeden ausgelösten 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 // 0Kombiniere es mit ?? für einen Inline-Standardwert. Dies ist die kürzeste Version von „Rufe dieses Ding auf, gib mir so oder so einen Wert“.
try! sagt: „Ich weiß, dass dies keinen throw auslösen wird.“ Wenn es doch passiert, stürzt dein Programm ab. Verwende es nur, wenn du beweisen kannst, dass der Aufruf sicher ist; im alltäglichen Code solltest du try? mit einem fallback oder das vollständige do/catch bevorzugen.
Aufgabe
EinfachDefiniere NumError: Error mit einem Fall bad. Definiere eine auslösende Funktion parseEven(_ s: String) throws -> Int, die:
.badauslöst, wennsnicht alsIntgeparst werden kann oder wenn der geparste Wert ungerade ist- andernfalls die geparste Ganzzahl zurückgibt
Lies eine einzelne Eingabezeile ein: eine durch Kommas getrennte Liste von Zeichenfolgen. Verwende für jede davon try?, gefolgt von ?? -1, um entweder die geparste gerade Ganzzahl oder -1 zu erhalten.
Gib die resultierenden Ganzzahlen in derselben Reihenfolge aus, verbunden mit ,. 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
3Probier 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 TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – Wortstatistik3Wörterbücher
Wörterbücher deklarierenOptionale SucheWörterbücher aktualisierenWörterbücher durchlaufenWerte gruppierenRückblick – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenRückblick – Bestenliste9Fehlerbehandlung
throws und Errordo, try, catchtry? und try!Fehler weitergebenRückblick – Sicherer RechnerÜbe selbstständig: Swift-Playground