今回はSwiftにおけるguard let文について。
if let文と同じく、慣れるまでなかなか理解が難しかったのがこの guard let文 だ。
備忘録として理解した内容を記事にしておきたいと思う。
guard let 文とは?
guard let文とは対象のプロパティ(オプショナル型)の値がnilかどうかチェックし、nilではない場合(値が存在する場合)はそのプロパティをアンラップ処理してくれる便利な仕組みだ。
このguard let文は条件が満たされなかった場合に、早期に現在のスコープから抜ける必要がある場面で使用される。
基本構文は下記の通りだ。
1 2 3 4 5 6 7 | guard let 定数名 = 対象のプロパティ else { // 条件が満たされなかった場合の処理 return //またはbreak } // 条件が満たされた場合の処理 // スコープの外でも定数名を使用可能 |
私がguard let文を理解しにくかった原因の1つが、条件がfalseの場合に処理されるelse節が guard letの直後にあることだった。
if文等で条件がtrueの場合の処理が直後に記載されていることに慣れていたため、最初は条件がtrueの時にelse節が実行されるのかと勘違いしていた。
そのため最初は全く理解できなかった(笑)。
実際に、guard let文の条件がtrueの場合とfalseの場合でどの部分が実行されるかを具体例で確認するとグッと理解しやすくなる。
下記のコードを例に確認していこう。
1 2 3 4 5 6 7 8 | //productPriceはオプショナル型のプロパティとする guard let price = productPrice else { print("商品の価格が設定されていません。") return } print("商品の価格は \(price) 円です。") |
上記コードにおいて、guard letでチェックの対象となるプロパティが productPrice だ。
guard let がtrueになる場合
このproductPriceプロパティ に値が存在する場合、定数priceにその値が代入される。
この場合、guard letの条件式はtrueとなる。
条件式がtrueになるので、else節の実行はスキップされ、その次のprint(~)が実行される。
例えば、productPrice=300の場合は下記となる。
productPrice=300 、つまり値が存在するので、定数priceにproductPriceの値が代入される。
定数 price に値が代入されるので、guard let文の条件がtrueとなり、条件がfalseの時に実行されるelse節はスキップされる。
そして、guard let文の次の処理であるprint()が実行されるというわけだ。
if let文と違い、guard letでアンラップした定数(今回の場合はprice)の値はguard letのスコープ(else節内)の外でも利用可能な点は覚えておきたい。
guard let がfalseになる場合
一方、productPriceプロパティ に値が存在しない = nil の場合、priceへの値の代入は行われない。
そして、guard let文の条件式はfalseとなるので、直後のelse節が実行される。
else節の中でreturnが実行されるとメソッドの処理から抜けるため、その後のprint()が実行されないで終了する。
これが条件式がfalseの場合の挙動だ。
guard let文を使用する際の注意点として覚えておきたいのは、else節の中に必ず処理から抜けるためのreturnやbreak等を記載する必要があることだ。
まとめ
Swift における guard let 文の要点は下記だ。
- guard let文は対象のオプショナル型のプロパティがnilかどうかをチェックし、nil ではない場合はアンラップしてくれる便利な仕組み
- 条件式がtrueの時はelse節はスキップされ、次のコードが実行される
- 条件式がfalseの時はelse節が実行され、else節内のreturn等によりメソッドの処理から抜けるため、後続のコードは実行されない
- else節の中には処理から抜けるためのreturnやbreak等の記載が必ず必要となる。
以前の私のようにguard let 文の理解で苦労している人の参考に少しでもなれば幸いだ。