LoginSignup
47
47

More than 5 years have passed since last update.

Swift 1.2でスマートにOptionalをUnwrap (複数let, where)

Posted at

Xcode 6.3 betaから触ってるひとには今更感ありありですが^^;

サンプル

class HogeHogeViewController {
    var textField: UITextField?
    var button: UIButton?

    ...

    func event() {
        ...
    }
}

例として、Optional型でtextFieldとbuttonを保持していて、event()が実行された時に、それぞれの状態をチェックしたい的な状況

1.2以前

func event() {
    if let textField = self.textField {
        if textField.isFirstResponder() {
            if let button = self.button {
                if button.enabled {
                    // Do something
                }
            }
        }
    }
}

Optional Bindingでアンラップしようとするとネストのお化けに・・・

もしくは、

func event() {
    if self.textField != nil && self.textField!.isFirstResponder() &&
      self.button != nil && self.button!.enabled {
        // Do something
    }
}

こう書けばネストは無くせるけど、自分でnilチェックしてから暗黙的アンラップ(!)っていうのがなんか強引な気がしないでもない

Swift 1.2

  • 一つのif文内で、複数変数がOptional Bindingが可能
  • where句をつかってBindされた変数に対して評価が可能

という改善がされたので、以下のように(個人的には)スマートに書けるようになった模様

func event() {
    if let textField = self.textField, let button = self.button where textField.isFirstResponder() && button.enabled {
        // Do something
    }
}

蛇足

例のために1個のifにまとめたけど、whereで2つの条件をチェックしてるのは詰め込み過ぎに感じるので

func event() {
    if let textField = self.textField where textField.isFirstResponder() {
        if let button = self.button where button.enabled {
            // Do something
        }
    }
}

2つに分けるほうが好み

47
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
47