[解決済み] トライ、トライ!&トライ、それぞれの違いや使い分けは?
質問
で
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
関連
-
[解決済み] XCTest の基礎となるモジュールをロードできない
-
スレッド1:シグナルSIGABRTの問題解決
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] なぜクラスではなくストラクチャーを選ぶのか?
-
[解決済み】 `throw new Error` と `throw someObject` の違いは何ですか?
-
[解決済み】Swiftのオプション値とは何ですか?
-
[解決済み】Swiftでボタンに丸みを帯びたボーダーを付けるにはどうすればいいですか?
-
[解決済み】iOS8でSwiftを使用して特定のViewControllerのステータスバーの色を変更する。
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
-
[解決済み】ReactiveCocoaとRxSwiftの比較 - 長所と短所?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Swift presentViewController
-
[解決済み] XCTest の基礎となるモジュールをロードできない
-
スレッド1:シグナルSIGABRTの問題解決
-
[解決済み] Error: this class is not key value coding-compliant for key tableView.' [重複] を修正する方法。
-
[解決済み] Swiftでコアデータを日付(時間だけでなく)でソートする
-
[解決済み] SwiftはPass By ValueかPass By Referenceか
-
[解決済み] Swiftで乱数を生成する方法とは?
-
[解決済み】Xcode 6 Beta 4でアプリを実行すると「表示権限がないため、ファイル "MyApp.app" を開くことができません。
-
[解決済み】SwiftでFloatをIntに変換する。
-
[解決済み】Swiftで辞書に要素を追加する方法は?