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