- 更新日: 2019年04月10日
- 公開日: 2019年04月04日
【かけ出しiPhoneアプリ開発】guard文について
iPhoneアプリ開発をはじめたばかりの方にお届けする 【かけ出しiPhoneアプリ開発】 シリーズ。
今回は 『guard文』 についてご紹介。
Swiftの基礎学習では出てこなかった guard文、 JSONなどのデータを扱うようになると頻繁に登場。guard文の基本を理解して、アプリ開発に励みたいですね。
本稿で使用する各種ソフトのバージョン:
- XCode 10.1
- Swift 4.2
【かけ出しiPhoneアプリ開発】guard文について
guard文とは
guard文は、ループや while、 if といった制御分の一種で、主な機能としては以下のような 2つの働きを行います。
- if 文のような条件分岐をできる
- オプショナル型(?)をアンラップできる
オプショナル型を・・・? if文の・・・? と Swiftをはじめたばかりの方にとっては、ぱっとイメージできないキーワードばかり。。。 guard文の学習前に一度 オプショナル型と if文の項目を見直しておくと guard文の理解も早まると思います。
また上記のような guard文の機能は、 JSONデータの取得処理などで役に立ち、 JSONデータの処理プロセスでよく guard() が登場してきますね。
guardのサンプル
【上図のSwiftコード】
func wallet(money: Int){
guard(money > 1000) else {
print("残高不足、引き落とし不可")
return
}
print("引き落とし可能")
}
//
wallet(money:190)
//
wallet(money:20000)
まず制御文としての guard から確認していきましょう。guardは、 if文のような働きを行いますが、ちょっと制御フローが if文とは異なります。guardの制御文を日本語で書くと以下のようになるでしょう。
guard(条件式) else {
条件が満たされていない時の処理
return
}
条件が満たされている時の処理
if文の場合は、上から「条件が満たされていたら・・・」というフィルターで処理が進みますが、 guard文の場合は逆の「条件が満たされていなかったら・・・」というフローで処理が進みます。
上図コードの場合は、アカウントから出金する際にチェックを行うコードで、最低出金額 1000に達していなかったら "残高不足、引き落とし不可" の処理。逆に残高が 1000以上の場合は、条件式をクリアしているので "引き落とし可能" の処理になります。
こうした感じで guard文は、「○○でなかったら、、、」という形で処理が進みますね。次は guard文とオプショナル型について確認していきましょう。
guard文とオプショナル型
【上図のSwiftコード】
var myNumber : Int?
myNumber = 123456789
print(type(of: myNumber))
print(myNumber)
//
print("\n")
//
func sample(myNumber:Int?){
guard let myNumber = myNumber else {
print("")
return
}
print("私のマイナンバー: \(myNumber)")
print(type(of: myNumber))
}
//
sample(myNumber: 123)
//
print("\n")
//
print(type(of: myNumber))
print(myNumber)
//
print("\n")
//
sample(myNumber: )
print(type(of: myNumber))
簡単な例を元に guard文とオプショナル型の関係を確認していきましょう。 まずサンプルの上図ですが、マイナンバーが入力されていれば "私のマイナンバー: ○○" と出力される簡単なプログラムです。 色付きのマーク部分は、各処理工程の中でデータ型がどうなっているかをチェックしています。
まず最初にマイナンバーは、未入力の時もあると思いますので var myNumber: Int? と nil(未入力)を許容するオプショナル型に。 そのため赤色マーク部分では、 myNumber に値があってもオプショナル型としてデータを扱っています。
次に guard文の中にプログラムが進み、 myNumber = myNumber なので青色マーク部分に処理が進みます。こちらで myNumber の型を確認してみるとオプショナルが外れて、単なる整数型に。 printしても optional() のない形で値を出力できていますね。
そして guard文外のオレンジ色マーク分で再度 myNumber の型をチェック。するとまた最初のオプショナル型になっています。このように guard文を使い、 guard文内で処理されるオプショナル型については自動的にアンラップされるんですね。
この guard の働きは、 Swift で JSONデータを扱う時に必要で、 JSONデータをデコードする時に data をアンラップし、 JSONデータを Swiftで扱えるようにしています。
if文とguard文の違い
guard文とif文、どちらも条件分岐を行う構文で似ていますので、比較してみました。
【上図のguard文のSwiftコード】
var username: String?
var password: String?
//
func login(username:String?, password:String?){
guard let username = username else{
print("No")
return
}
guard let password = password else{
print("No")
return
}
print(username, password)
}
//
login(username: "Tarou", password: "1234")
【上図のifd文のSwiftコード】
let username:String? = "Jirou"
let password:String? = "8888"
//
func login(){
if let username = username{
if let password = password{
print(username)
print(password)
} else {
print("error")
}
}
}
//
login()
まずパッと見た感じは guard文 の方が記述量が多く、最初はとっつきにくいかもしれません。しかし、guard文は「○○でなかったら・・・」というチェック指向の処理フロー。そしてチェック事項が増えても guard 毎に処理をまとめていますので、機能の増減に柔軟に対応できます。
一方 if文の方は、一見記述量が少なく見えて良さそうなものの、 if文内の記述を変更する度に全体のプロセスを読みなおす必要が。そして基本的には、if文の前にプロパティがセットされますので、途中何だかのプログラム処理で発生する変数を用いて、ifフローを使用することは不可能。
このように guard文と if文は似たイメージがありますが、コードで書くと全然違ってきますので、混同しないように注意する必要がありますね。
\Webサイト担当者としてのスキルが身に付く!!/
まとめ
guard文は、条件分岐に加えてオプショナル型も操作する高機能な構文ですが、はじめてその処理を目の当たりにした時、私の頭は guardの制御についていけませんでした。どちらかというと条件分岐の方ばかりに思考が傾き、オプショナル型のエラー乱発で、混乱を招く自体に。それでも JSONを扱う上で guard文が必要だったので頑張っていくと、結果的に二次元配列の思考回路が脳内にできた感じです。
「gurad文とか飛ばしてJSONデータ使いたいっ!」「guard以前にオプショナルとか条件分岐とかナニ?」という方、 Swiftの基礎学習はお済みでしょうか?手っ取り早く、確実に Swiftの基礎スキルを身に着けたいのなら、やはりプログラミング・スクールではないでしょうか?
中でもオンライン型のプログラミング・スクールは、「場所」と「時間」の負担を極力減らした現代人に優しい学習環境。「オンラインのプログラミング・スクール?」と思われた方、まずは体験してその良さ・悪さを実感していませんか?
オンライン型プログラミング・スクールで定評のある CodeCamp では、随時無料体験を受け付けています。手続きは Web上で完結しますので、一度ホームページを覗いてチェックしてみませんか?
- この記事を書いた人
- オシママサラ