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 を優先してください。
チャレンジ
簡単1つのケース bad を持つ NumError: Error を定義します。次の処理を行う、エラーをスローする parseEven(_ s: String) throws -> Int を定義します。
sをIntとして解析できない場合、または解析された値が奇数の場合は.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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド