概要
ビデオ通話実装中に、マイク機能とスピーカー機能、カメラの反転機能の実装をしていた時に、switch文を用いてtrueとfalesを判別していました。しかし、その条件分岐を3つの機能にそれぞれ、記述しないといけなかったのでかなり可読性が低いコードになっていました。そこで、レビュー時にtoggle()というものを教えていただいたので、備忘録を残しておきます。
前提条件
「そもそも、toggleとは何ぞや?」ということで、Apple公式ドキュメントを調べてみました。
ドキュメントには、こう書かれていました。
「Use this method to toggle a Boolean value from true to false or from false to true.」
var bools = [true, false]
bools[0].toggle()
// bools == [false, false]
要するに、「変数が持っている現状のBool値を切り替えたい時に使えよ!(もちろん、定数ではない。)」とのことです。
Apple公式ドキュメント
自分は、今まで以下のように実装をしてかなり面倒な実装をしていたので「toggle()」に出会って人生が変わりました!(大嘘)
実装方法
それでは、実際にどのようにtoggle()を用いてリファクタリングしたのかを確認してみましょう!
まずは、リファクタリング前のswitch文での条件分岐から!(コードが汚いかもしれませんが、ご了承ください。)
@IBOutlet private weak var speakerButton: UIButton!
private weak var isSpeakerOn = true
@IBAction private func tappedMic(_ sender: UIButton) {
swith isSpeakerOn {
case .true:
//スピーカー機能オフ
speakerButton.background = 暗い系の色
isSpeakerOn = false
case .false:
//スピーカー機能オン
speakerButton.background = 明るい系の色
isSpeakerOn = true
}
}
まぁ安易にやりがちなコードの書き方かなと思います。
次はリファクタリング後です。
@IBOutlet private weak var speakerButton: UIButton!
private weak var isSpeakerOn = true
@IBAction private func tappedMic(_ sender: UIButton) {
//スピーカー機能オンとオフの機能
let backgroundColor: UIColor = isSpeakerOn ? 暗い系の色 : 明るい系の色
isSpeakerOn.backgroundColor = backgroundColor
//ここで、toggleを使用する!
isSpeakerOn.toggle()
}
実際には、BeforeSwitch.swiftのswitch文の中にもっと色んな要素が入っていましたが、上記のように、toggle()と三項演算子をうまく活用することで、より可読性が高いコードを書くことができました!
やはり、switch文は場合分けを可視化するにはいいかもしれませんが、「可視化すること=可読性の向上」にならないということを改めて学びました。
レビューしていただくと本当に勉強になります!
ちなみに、toggleとは以下の辞書によると、電子計算機の2つの状態をトグルで切り換えるという意味で、そもそも英語では、toggle単語は一般的に使われるんですかね。英単語を調べたりしながら実装すると理解しやすい。
さいごに
今回はレビューをしていただき、提案していただいてtoggle()の存在を知りましたが、今後は自分でも「ここはこのように書けば、もっと可読性が良くなるのでは?」という視点を持ってコードを書いていきたいと思います!