Menu
Coddy logo textTech

try? と try!

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 46/56。

関数がどのエラーをスローしたかを気にせず、単に結果かフォールバックが欲しいだけの場合があります。Swiftには2つの短縮形が用意されています。

try? は、スローされたあらゆるエラーを nil に変換します。結果は、関数の戻り値の型の Optional になります:

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

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

インラインのデフォルト値として ?? と組み合わせてください。これは「これを呼び出して、いずれにせよ値を返す」という処理の最短バージョンです。

try! は「これがエラーをスローしないことを私は知っている」ということを示します。もしエラーが発生した場合、プログラムはクラッシュします。その呼び出しが安全であることを証明できる場合にのみ使用してください。日常的なコードでは、フォールバックを伴う try? や、完全な do/catch を優先してください。

challenge icon

チャレンジ

簡単

1つのケース bad を持つ NumError: Error を定義してください。次に、以下の動作をするスロー関数 parseEven(_ s: String) throws -> Int を定義してください:

  • sInt として解析できない場合、または解析された値が奇数の場合に .bad をスローする
  • それ以外の場合は、解析された整数を返す

カンマ区切りの文字列リストである1行の入力を読み込みます。各文字列に対して、try? とそれに続く ?? -1 を使用して、解析された偶数の整数または -1 のいずれかを取得します。

結果の整数を , で連結して順番に表示します。次に、2行目に -1 として返された値の数を出力します。

入力が 4,7,abc,8,11,2 の場合、出力は以下のようになります:

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

チートシート

try? はスローされたエラーを nil に変換し、Optional を返します:

let result = try? risky()        // スロー時は nil
let safe   = (try? risky()) ?? 0 // フォールバック値

try! は呼び出しがスローされた場合にクラッシュします。呼び出しが安全であることが保証されている場合にのみ使用してください:

let value = try! guaranteedSafe()

自分で試してみよう

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

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// 各パーツについて、 (try? parseEven(part)) ?? -1
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン