Posted at

【Swift】guard文について


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です