ペンギン村 Tech Blog

技術をこよなく愛するエンジニア集団が在住するペンギン村から、世界へ役立つ(かもしれない)技術情報を発信する技術系ブログです。某アラレちゃんが済む村とは一切関係ありません。んちゃ!

Swift 4.2 では boolean の反転(toggle)ができるようになる(SE-0196)

どうも。ルパン三世 Part 5 の続きが楽しみな tobi462 です。

さて前回のenumの新機能に続き、また Swift 4.2 の話題です。

といっても、今回は驚くほど短いです(汗)

Tl;Dr

// before
messageLabel.isHidden = !messageLabel.isHidden

// after
messageLabel.isHidden.toggle()

toggle()

SE-0196 にて Bool の extension として toggle メソッドが用意されました。

冒頭に書いたとおり、いままで foo.bar = !foo.bar というコードを書かなければならなかったところが foo.bar.toggle() と書けるようになるわけです。

まぁ、自前で実装していた方も多いかもしれませんが。

実装

具体的な実装は以下のようになっているようです。

extension Bool {
  @_inlineable
  /// Toggles the value of the Boolean. 
  ///
  /// Calling this method sets the variable to `true` if it was `false`,
  /// and sets it to `false` if it was `true`. For example:
  ///
  ///    var bools = [true, false]
  ///
  ///    bools[0].toggle()
  ///    // bools now contains [false, false]
  public mutating func toggle() {
    self = !self
  }
}

swift/Bool.swift at swift-4.2-branch · apple/swift · GitHub

まぁ・・・まんまですね(笑)

ちなみに2行目の @_inlineable は初めて知ったのですが、SE-0193 で既に実装されていたようです。

どの Swift バージョンで入ったかはすぐに終えなかったのですが、とりあえず Swift 4.2 では利用できました。

関数のインライン化はパフォーマンス的に有利な面もあると思いますが、多くのケースでは過度な最適化にあたると思うので、普段のiOSアプリ開発では利用しないほうが良いのでしょう。(きっと)

閑話休題。

おわり

foo.bar = !foo.bar はある意味、DRY原則にも反していると言えます。

今後は foo.bar.toggle() というスッキリした書き方ができて良いですね。