1. ホーム
  2. swift

[解決済み] トライ、トライ!&トライ、それぞれの違いや使い分けは?

2022-04-14 03:38:22

質問

Swift 2.0 Appleはエラーを処理する新しい方法(do-try-catch)を導入しました。 そして数日前の Beta 6 では、さらに新しいキーワードが導入されました ( try? ). また、私は try! . 3つのキーワードの違いと、それぞれを使うべきタイミングを教えてください。

どのように解決するのか?

Swift 5.1へのアップデート

次のような投擲関数を想定する。

enum ThrowableError: Error {

    case badError(howBad: Int)
}

func doSomething(everythingIsFine: Bool = false) throws -> String {

  if everythingIsFine {
      return "Everything is ok"
  } else {
      throw ThrowableError.badError(howBad: 4)
  }
}

トライ

throwする可能性のある関数を呼び出そうとした場合、2つのオプションがあります。

を担当することができます。 エラー処理 のように、do-catch ブロックで呼び出しを囲むことです。

do {
    let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
    // Here you know about the error
    // Feel free to handle or to re-throw

    // 1. Handle
    print("Bad Error (How Bad Level: \(howBad)")

    // 2. Re-throw
    throw ThrowableError.badError(howBad: howBad)
}

あるいは、ただ関数を呼び出してみて エラーを渡す をコールチェーンの次の呼び出し元へ送る。

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}

を試してみてください。

暗黙のうちにアンラップされたオプショナルに、nilを内包してアクセスしようとするとどうなるでしょうか。そうです、アプリがクラッシュしてしまいます。 tryも同じです!tryは基本的にエラーチェーンを無視し、「やるか死ぬか」の状況を宣言しています。呼び出された関数が何もエラーを出さなければ、すべてがうまくいきます。しかし、もしそれが失敗してエラーを投げたら アプリケーションは単にクラッシュします。 .

let result = try! doSomething() // if an error was thrown, CRASH!

を試してみませんか?

Xcode 7 beta 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?を使用してください。

Coalescing Operatorの使用 ?

tryと一緒に合体演算子を使うと、失敗したときのデフォルト値を提供することができます。

let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value