web-dev-qa-db-ja.com

やって、やって!してみて?違いは何ですか、それぞれをいつ使用するのですか?

Swift 2. で、Appleはエラーを処理する新しい方法を導入しました(do-try-catch)。数日前のベータ6では、さらに新しいキーワード(try?)が導入されました。また、try!を使用できることも知っていました。 3つのキーワードの違いと、それぞれを使用するタイミングは何ですか?

157
Abdurrahman

次のスロー機能を想定します。

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を使用しますか?物事が失敗した理由ではなく、成功と失敗にもっと集中するとき。

294
Abdurrahman