throws と Error
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 44/56。
Swiftは、関数が失敗する可能性があることを宣言させることでエラーを処理します。関数の本体はエラー値をスローし、呼び出し側はそれを処理しなければなりません。
エラー型とは、組み込みの Error プロトコルに準拠するあらゆるもののことです。独自のエラーを宣言する最も簡単な方法は、列挙型(enum)を使用することです:
enum InputError: Error {
case empty
case tooLong
}エラーをスローする関数は、そのシグネチャで throws キーワードを使用し、その本体で throw 文を使用します:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}エラーをスローする関数を直接呼び出すことはできません。コンパイラによってエラーの処理が強制されます。次のレッスンでその方法を説明します。
チャレンジ
簡単2つのケース negative と tooBig を持つ、enum NumError: Error を定義してください。
以下の動作をするスロー関数(throwing function) doubleSafely(_ n: Int) throws -> Int を定義してください:
n < 0のときは.negativeをスローするn > 100のときは.tooBigをスローする- それ以外の場合は
n * 2を返す
標準入力から1つの整数を読み込みます。do/catch ブロックの中で doubleSafely を呼び出してください(正確な形式は次のレッスンで学びますが、今は以下のスケルトンをそのまま使用してください):
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}入力が 10 の場合、出力は ok: 20 となります。-1 の場合は negative、500 の場合は too big となります。
チートシート
Errorに準拠した列挙型(enum)を使用してエラー型を定義します:
enum InputError: Error {
case empty
case tooLong
}throwsを使用して関数がエラーをスローすることをマークし、throwを使用してエラーを発生させます:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}エラーをスローする関数は、エラーハンドリング(例:do/catch)を伴って呼び出す必要があります。これはコンパイラによって強制されます。
自分で試してみよう
let n = Int(readLine()!)!
// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。