Menu
Coddy logo textTech

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 // 0

Kombinieren 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.

challenge icon

Aufgabe

Einfach

Definiere NumError: Error mit einem Case bad. Definiere eine throwing Function parseEven(_ s: String) throws -> Int, die:

  • .bad wirft, wenn s nicht als Int geparst 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
3

Spickzettel

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-Wert

try! 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss