LoginSignup
7
6

More than 3 years have passed since last update.

【Swift】guard文について

Posted at

guard文とは

guard文とはif文と同じような、条件分岐の文法のことを指します。この文法のif文と違う点は、最初の分岐点がfalse判定の時に処理される文だということです。そのため後続の処理を行う時にtrue判定が返っているということになります。

定義

guard文の定義文は以下になります。
guardの後に条件式を記述し、その後にif文だとfalse判定の時に記述するelseを書きます。
中括弧内はfalseのときの処理を記述し、ポイントはこの処理をの最後にguard文が記述されるスコープの外に退出する必要があるということです。次のサンプルコードで説明します。

guard 条件式 else {
  条件式がfalseの場合に実行される文
 guard文が記述されるスコープの外に退出する必要がある。
}

サンプルコード

以下がサンプルコードになります。
guard文内の処理はaが0より小さい値であった場合に処理を行い文字列をプリント、そうでない場合は1をプリントで終了です。
注意点としてはreturnでスコープ外に退出していますが、この退出するというのはguard文から出るということではなく、この場合関数から出るということになります。あくまでスコープ外っていうのを注意してください。
そしてもう一つ注意点としてはスコープからの退出はコンパイラによってチェックされているため、しっかり退出しないとコンパイルエラーになるので注意が必要です。

//関数定義
func printIfPositive(_ a: Int) {

//guard文定義
  guard a > 0 else{

  //falseの場合に処理
    print("数値は0未満です")

  //スコープ外に退出
    return
  }
  print a
}
//結果
 printIfPositive(1)

//結果
1

guard-let文

guard-let文は条件文内でletを用いることで、値を代入し、それを判定する文です。
説明が非常に分かりにくいと思うので、とりあえず下記のサンプルコードを見てください。
guard-let文の条件式内でintにaが代入されていて、そしてInt型かどうかを判定しています。
この文法で特に注意するべき点は条件文で定義した定数がguardのスコープ内なら、使えるということです。
今回の場合だとsomeFunction内がスコープの範囲になるので、その中では使えることになります。

func someFunciton() {
  let a: Any = 1

  guard let int = a as? Int else {
    print("aはInt型ではありません")
    return
  }
  //intはguard文以降でも使用可能
  print("値はInt型の\(int)です")
}

someFunction()

//結果
値はInt型の1です
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6