先月【Swift】guard文の使い方についての記事を掲載しました。
今回は、guard文と同様に使用されるguard-let文についてif-let文との違いを交え、自分用の備忘録として、どんな処理を行う文法なのか記載します。
guard-let文とは?
guard-let文とは、if-let文にguard文の適性を持った構文です。
まずはguard-let文に近いif-let文について記載してみます。
if-let文とは?
if-let文とは、オプショナルバインディングを行う条件分岐文です。
オプショナルバインディングとは、値が含まれているかが不明な変数に対し、値が含まれているかのチェックと、値が含まれている場合に値を取り出すことを指します。
if-let文は、基本的に下記のように記載します。
let Name = Optional("Taro")
if let Name {
print("名前は\(Name)です")
} else {
print("名前はありません。")
}
上記では、String?型の定数Nameに値が存在すれば、String型の定数aにその値が代入され、続く{}内の文が実行されます。
ただし、if-let文で宣言された定数は、{}内でのみ使用できます。
下記では、if-let文で宣言した定数をスコープ外でアクセスしているため、コンパイルできずエラーとなります。
let Name: Any = "Jiro"
if let st = Name as? String {
// stはここでは使用可能
}
// ここでのstは使用不可のためコンパイルエラー
print(st)
ここまではif-letについて記載してみました。
次は、guard-let文とif-let文の違いについて、記載してみます。
guard-let文とif-let文の違い
guard-let文はif-let文と違い、letの部分で記載した定数がスコープ外でアクセス可能である点です。
なぜスコープ外でもアクセス可能かというと、guard文以降では変数や定数の存在が保証されているためとなります。
以下に例を記載してみます。
func MyName
let Name: Any = "Taro"
guard let st = Name as? String else {
print("aはString型ではありません。")
return
}
// stはguard分以降でも使用可能
print("名前はString型で\(st)です。")
}
MyName()
<実行結果>
// 名前はString型でTaroです。
上記では、stがスコープ外に出た場合は、stには値の存在が確定しています。
なぜ確定しているかというと、guard文は条件不成立時に早期退出を行うため、Nameが存在しない場合はスコープの中の処理("aはString型ではありません。")を実行します。
上記より、スコープ外が実行には、stに値が存在していることが前提となるため、コンパイルエラーが起きないことは確定されてい状態だからです。
このように、if-let文では定義した定数がスコープ外はアクセス不可能であるのに対し、guard-let文では、定義した定数がスコープ外にてアクセス可能であることがわかるかと思います。
まとめ
guard-let文について記載してみました。
これまではオプショナルの概念がない言語ばかり触ってきたので、guard文およびguard-let文について新鮮に学ぶことができました。
また、Swiftはこれまで業務で使用していたため業務の中で新しい発見として学ぶことができていました。
これからは業務で触る機会がなくなっていく中で、Swiftはまだまだ分からない点が多い部分もあるため、引き続き教本等を用いながら学習を続けていきます。