どうも。ルパン三世 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()
というスッキリした書き方ができて良いですね。