###1.はじめに
前回オプショナル型の基本についての記事を書きましたが、今回はオプショナル型を実装するうえで、コードを読みやすく、スマートに書くことができる、オプショナル束縛構文について解説しようと思います。
前回の記事はこちらです。
(https://qiita.com/0901_yasyun/items/d64986bdfe917d90382c)
###2.オプショナル束縛構文とは
まず以下のif文の条件を見てください。
let year : Int? = Int("2000")
if let y = year { //ここのif文の書き方に注目
print("ハレー彗星は\(y + 61)年に来る")
}else{
print("エラー")
}
この条件の書き方は、if文とwhile文の条件部にのみ記述することができる、特別な構文です。これをオプショナル構文、またはif-let文と呼びます。
このコードだと、もし変数yearがnilではない値を持っていたら、if文の条件判定は真となります。
###3.コードを書く上でのメリット
通常通りであれば、まずオプショナル型の式の値がnilなのかどうかをチェックし、その後にまったくの別で、その値を使用したコードを書いていくことになります。
しかしこの書き方を使うことで、オプショナル型の式の値がnilではなかった場合、その値をチェックしたif文のthen節で、そのまま使うことができます。
###4.オプショナル束縛構文の使い方
基本的な構文の使い方は、2で示したコードの通りです。
気を付けることとしては、2のコードにおいてyearの値がnilであれば、if文の条件は偽でelse節が実行されますが、その場合定数yはelse節では使うことができません。
オプショナル束縛構文の条件が成立した場合、条件部で定義された変数などはthen節でしか参照することはできません。これを利用してこの変数などに、元のオプショナル型の変数などと同じ名前を使うことができます。以下のコードを見てください。
let halley : Int? = Int("2000") //定数halleyはInt?型
if var halley = halley { //変数halleyはInt型であり、then節内でのみ有効
print("ハレー彗星は\(halley)年に来た")
halley += 61
print("次は\(halley)年だと予想される")
}
なお、先ほども述べましたが、オプショナル束縛はif文やwhile文の条件部に記述したときのみ、特別な意味を持つので注意してください。
###5.オプショナル束縛と条件式
複数のオプショナル型の値を使って処理を行いたい場合、if-let文をネストすることもできますが、カンマで区切って複数の条件を並べることができます。以下のコードを見てください。
if let sapporo = Int("1972"), let nagano = Int("1998") {
print("\(nagano - sapporo) years.")
}
オプショナル型の値だけでなく、その他の条件もカンマで区切って記述することができます。
var nagano = 1998
if nagano < 2000, let tokyo = Int("2020"), tokyo > nagano {
print("\(tokyo - nagano)") //22と出力される
}
条件を複数書いた場合、このコードだとnaganoが2000未満の場合のみ、カンマの右側のオプショナル束縛の評価に進みます。オプショナル式がnilではなかった場合、定数tokyoにInt型の値が代入され、さらに右の条件式が評価されます。
このように、一番左側から条件の評価が始まり、条件式が偽になるか、オプショナル式がnilだった時点で評価は終了し、ifの条件は偽となります。
また、左側で値が代入された定数や変数を、右側の式で使うこともできます。
###おわりに
今回はコードをきれいに書く上で必須ともいえる、オプショナル束縛構文の使い方について解説しました。コードの可読性を高めることは、自分の書いたコードを世の中に発信する際にとても重要なことなので、ぜひこの書き方を利用してみてください。