iOS
Swift4.2

Swift4.2でBool値の反転をtoggleで行う

はじめに

Swift4.2からBool値の変更用のメソッドとしてtoggle()が登場しました。
個人用も兼ねてのメモです。

検証環境

以下の環境を使用しています。

  • macOS Version 10.13.4
  • Xcode Version 10.0.0 β3

toggleについて

例えばある項目のチェックのON、OFFを切り替える際に、従来であれば以下のようなコードになっていました。基本的には問題ありませんが、代入時の!をつけ忘れてしまい不具合を発生させる要因になりかねません。

var isChecked = false
@IBAction func didTouchUpInsideCheckButton(sender: UIButton) {
    isChecked = !isChecked
}

Swift4.2以降では以下のように書くことができるようになります。
!のつけ忘れ等の心配もありません。

var isChecked = false
@IBAction func didTouchUpInsideCheckButton(sender: UIButton) {
    isChecked.toggle()
}

Swiftでの実装

Swiftのリポジトリを確認すると、実際の実装は下記のようになっています。

public struct Bool {
  // 省略
}

extension Bool {
  @inlinable
  public mutating func toggle() {
      self = !self
  }
}

mutatingが付与されているため、自身の値の変更が可能になっています。
当然ですが、以下のようにletで定義したBool値に対して使用するとおこられます。

let isHidden = false
isHidden.toggle() 
// Cannot use mutating member on immutable value: 'isHidden' is a 'let' constant

参考

Proposalおよび該当メソッドの箇所を以下のリンクにまとめました。
適宜ご参照ください。