Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 397 - guard ステートメント

Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide

Xcondeがクラッシュして使えないと勉強が捗ります。

しばらく、The Swift Programming Language Swift 2本を眺めて勉強します。

Swift 2で新しく追加された機能をみていこうと思います。

今日は「guard」です。「guard」と言われても最初は何のことがさっぱり分かりませんでした。

「guard」で検索すると、「Control Flow」、「Error Handling」、「Patterns」なんてところにチラホラ出てきます。

たぶん、「if」と似たような使い方をするのですが、決定的に違うところが条件文の中で使う、定数(let)や変数(var)が条件文の外でも有効に働くということです。

例外処理がしやすいというところも特徴と言えるでしょう。

オプショナルな引数を受け取って処理をするメソッドや関数は、iOS FrameworksのAPI利用時に必須であり、「if let」パターンが入れ子状態なのは当たり前で、ifブロック内でしか利用できないので、変数や定数を解放させるために「guard」が実装されたような気もします。

func validateNumber(number: Int?) {
  if let someNumber = number where someNumber > 0 {
    print("Valid number is \(someNumber).")
    return
    // returnが必須でないため忘れるとエラーになりやすい。
    // 定数someNumberはifブロック内でだけ有効。
    // 入れ子状態でif letと繋いでいかないといけない。
  }
  // 基本的にここに例外処置を書くが、定数someNumberは使えない。
 return
}

「if let」の問題点を少し書き込んだけど、ifブロックにメインのコードを書く必要があるのですが、条件を反対にして、ifブロックに例外処理を書くというやり方もあります。しかし、その場合、条件で設定した定数や変数が使えないという欠点に対応するために引数を直接扱う必要が出てきて、「?」や「!」を意識してコードを書いていかないとランタイムエラーに遭遇してしまうということです。

こういう問題点に対応したのが「guard」で、必ず「else」と組み合わせて使う必要があり、例外処理が入るブロックで、returnのようなcontrol transferステートメントを必ず書く必要があります。

func validateCheck(number: Int?) {
    guard let someNumber = number where someNumber > 0 else {
        return
    }
    print("Valid number is \(someNumber).")
    // ここにメインになるコードを書くことができる。
    // 当然定数someNumberを使用することができる。
}

両方とも同じ関数でオプショナルなInt型変数が0以外の変数かどうか確認するだけなのですが、コードの可読性は「guard」に軍配が上がりそうです。

まあこんな所で今日は終わり。