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

自分で試してみよう

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

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

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

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

自分で練習してみよう: Swiftプレイグラウンド