はじめに
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および該当メソッドの箇所を以下のリンクにまとめました。
適宜ご参照ください。