公開中のアプリ

[Swift入門#32]guardを使ってみよう。

今回はguard(ガード)について書きたいと思います。
guardの説明から実際の使用例までサンプルコードをもとにわかりやすく説明していきたいと思います。

guardとは

簡単に言うと 異常処理をわかりやすくした仕組み です。
オプショナルバインディングと似た感じだけど、guardを使った方がわかりやすく便利ですよ〜って事かな!

まずは復習と予備知識の説明から

本題に入る前に、復習と予備知識の説明をしたいと思います!
手っ取り早くguardの書き方を知りたい人はここから読んで下さい〜。

オプショナルバインディングの場合

まずはオプショナルバインディングで書いた例です。
とりあえず簡単な関数を用意しました。
今回はU2のメンバーに関する関数にしました!
下記コードを見てみましょう!

func u2(_ menber: String?) {
    //オプショナルバインディング
    if let m = menber {
        print(m)
    } else {
        print("エラー")
    }
}
u2(nil)//結果 エラー
u2("エッジ")//結果 エッジ

この関数ですが、引数にオプショナル型を指定しています。
なので、引数を使う時はnilかどうかチェックしてから取り出す必要があります。

このあたりはこちらの[Swift入門#12]オプショナル型を使ってみよう。で説明していますので良かったら読んで見て下さい。

このようにオプショナルバインディングでチェックしても良いんですけど、処理が長くなったり複雑化すると、ちょっとわかりづらいと言う難点があるみたいです!

そこでよく使われるのが「 early return」又は「early exit 」と言う手法です。

early returnの書き方

early returnは 異常があったらすぐreturnをして処理を抜ける と言う書き方になります。

func u2(_ menber: String?) {
    //early return
    if menber == nil {
        print("エラー")
        return
    }
    print(menber!)
}
u2(nil)//結果 エラー
u2("ボノ")//結果 ボノ

まずif文で「引数menber」がnilだったらエラー時の処理を書いて、その後にreturnで処理を抜けます。

nilじゃなかった場合は7行目のように実行したい処理を書くと言う流れです。

ただarly returnにもデメリットがあって、arly returnを知らない人が見たらただのif文に見えたり、returnを書き忘れてしまう場合があります。

そこで登場するのが、guardです!

guardの書き方

お待たせしました!ここからguardの書き方の説明です!

func u2(_ menber: String?) {
    guard let m = menber else {
        print("エラー")
        return
    }
    print(m)
}
u2(nil)//結果 エラー
u2("アダム")//結果 アダム

guardの場合は、もし引数menberがnilじゃなかったらmに代入してnilだったらelseの中に処理を書いてくれって言う流れです!

guardの良いところはreturnを書き忘れるとエラーで教えてくれます!
もう一つは6行目のように !マークを書かなくてもそのまま使えます!

まとめ

今回はguardについて書きました!
基本的にはこのguardを積極的に使っていくのが良さそうですね〜!

“[Swift入門#32]guardを使ってみよう。” への1件のコメント

  1. […] では説明しますね。問題は2行目なのでじっくり説明したいと思います。Saveボタンを押した時の処理だったらsenderにsaveButtonが入って来るのでguradでチェックします。(guardについてはこちらの記事を読んでみてください)まずは「guard」と書いてその後「let button」で定数buttonを定義しています。その定数buttonにsenderを入れるのですが、「as? UIBarButtonItem」で型キャストしています。(型キャストについてはこちらの記事を読んでみてください)その次の「button === self.saveButton」で定数buttonが先ほど紐づけた変数saveButtonと同じオブジェクトかどうかチェックしています。(===は同じオブジェクトかどうか)ここで違うオブジェクトだった場合に処理を止めたいので「else{}」としてあげて「return」としています。同じオブジェクトだったら変数memoにテキストフィールドに入力されたテキストを代入してあげます。「?? “”」でnilだったら空文字になるようにしています。(何もテキスト入力せずにSaveボタンを押す可能性があるので) […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アプリ