寄付窓口はこちら

Swiftの Optional Binding が if let hoge = optionalHoge { if let foo = optionalFoo { } } ってネスト(入れ子)が深くなるけどもっと浅く書ける

電車で1時間かかるので毎日記事を書けるだろうと思ったら、朝は座れなかったり、夜は飲んで酔っ払って半分寝ながら帰ったり、終電時刻からのボーリングやカラオケであんまり記事をかけていない。

今日は機械学習勉強会でした。 developer.hatenastaff.com

そのあとオフィスでもうすぐ開催の開発合宿どうする?なんて話をしながらビールとピザとシュウマイを楽しむ宴に参加して、寝そうになりながら終電。充実ダ...!。というわけで軽めの話題。

SwiftといえばOptional。初めてすぐは"?"とか"!"とか出てきて頭の中は「!?」って感じになるし、論理否定演算子(! trueの ! )すらオプショナルの類かと思いながら読んでしまいますね。きっと共感いただけたあなたはOptionalの変数を使う時、Optional Binding (if let unwraped = optional { /* can use "unwraped" as unwraped "optional" */ })が王道っていう感じでOptional出てきたらよく if let ... にお世話になって日々ありがたみを感じている頃ではないでしょうか。guard let unwraped = optional else { /*nil だったぞ*/ } も使うかな?

そんな頃の悩みは多分これ。if let だらけでネストが深くなっていく。

if let hoge = optionalHoge {
    if let foo = optionalFoo {
        print("\(foo)")
    }
}

せっかく?を除去したのにこれじゃコードが読みにくくて「??」ってなる。キモチワルイのでなんとかならんのかと思って調べたら、Swift1.2(大分昔の話じゃないか!)からは1行で複数のOptional Bindingを実現できるようになってたとのこと。

ja.stackoverflow.com

こんな感じでネストがスッキリ!

if let hoge = optionalHoge, foo = optionalFoo {
    print("\(foo)")
}

よかった。

これは今夜の帰り道。