質問: foo.index(of: value) { foo.remove(at: index) } } ``` この中にif文の中で定数が定義され、値が代入され、何をどう比較しているのかがわかりません。 if文の中に比較演算子以外を見ることが初めてです。 定数が定義され代入したことで、Bool値(?)が真になり、実行されるというのであれば、この書き方である必要というのはあるのでしょうか? ご回答よろしくお願いいたします。
回答: `if let 〜` という構文はドキュメントで optional binding と呼ばれているもので、Optional 型の値に対して、非 nil な値になっているか nil になっているかで分岐するものです。通常の if 文と役割が似ているものの、別の構文だとお考えください。 具体的な構文は下のような感じです。 ``` if let 〈変数名〉 = 〈オプショナルな値〉 { 〈値が入っていた場合の処理〉 // ここの処理中で let で定義した変数を使えます } else { 〈nil の場合の処理〉 } ``` この構文は、オプショナルな値に対して「実際に値が入っていれば〇〇する、無ければ××する」という処理を書くときに用いることができます。この構文を使わなかった場合、nil かどうかのチェックと、nil でない場合に Optional 型から値だけ引き剥がす処理 (つまり、unwrap する処理) を書かないといけません。`if let` を使うことでこれらを短く書くことができます。 さて、今回問題となっているプログラムは次のものでした。 ``` func remove(value: String){ if let index = foo.index(of: value) { foo.remove(at: index) } } ``` この例だと、`foo.index(of: value)` の結果確かに `value` となるインデックスがあったときはそれが変数 `index` に代入され `foo.remove(at: index)` が実行される、そのようなインデックスが無ければ何もしない、という実装がなされています。