Swift 2. で、Appleはエラーを処理する新しい方法を導入しました(do-try-catch)。数日前のベータ6では、さらに新しいキーワード(try?
)が導入されました。また、try!
を使用できることも知っていました。 3つのキーワードの違いと、それぞれを使用するタイミングは何ですか?
次のスロー機能を想定します。
enum ThrowableError : ErrorType { case BadError }
func doSomething() throws -> String {
if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.BadError
}
}
スローする可能性のある関数を呼び出す場合、2つのオプションがあります。
Do-catchブロック内で呼び出しを囲むことにより、エラー処理の責任を負うことができます。
do {
let result = try doSomething()
}
catch {
// Here you know about the error
// Feel free to handle to re-throw
}
または、関数を呼び出してみてください-エラーを一緒に渡す呼び出しチェーンの次の呼び出し元に:
func doSomeOtherThing() throws -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
暗黙的にラップされていないオプションにnilを入れてアクセスしようとするとどうなりますか?はい、本当です、アプリはクラッシュします!試してみても同じです!基本的にエラーチェーンを無視し、「do or die」状況を宣言します。呼び出された関数がエラーをスローしなかった場合、すべてがうまくいきます。ただし、失敗してエラーがスローされた場合は、アプリケーションは単純にクラッシュします。
let result = try! doSomething() // if an error was thrown, CRASH!
Xcode 7ベータ6で導入された新しいキーワード。オプションを返します成功した値をアンラップし、nilを返すことでエラーをキャッチします。
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
または、新しい素晴らしいガードキーワードを使用できます。
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
ここで最後に注意する点は、try?
を使用することにより、発生したエラーは破棄され、nilに変換されることです。 tryを使用しますか?物事が失敗した理由ではなく、成功と失敗にもっと集中するとき。