SwiftBondを使ってみた。observeやObservableの使い方など
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
Swiftバインディングフレームワークである「SwiftBond」を使ってみました!
小さなサンプルを作ってみたので、それを使ってSwiftBondの使い方を簡単に紹介したいと思います。
「何かが起こったら、それに合わせて何かをしたい」を実現できる
SwiftBondはまだ少ししか使っていないのですが、いまのところ分かっているのは「何かが起こったら、それに合わせて何かをしたい」を簡単に実現できる仕組みなんだなあ、ということ。
他にも便利な側面があるのかもしれませんが、僕にとっては上記の仕組みだけでも十分に便利だと感じました。
今回作ってみたサンプルの内容
- タブによって3つの画面を切り替えられる
- それぞれの画面では、3つの色から1つを選択でき、選択するとその色を表示する
- 色の選択方法と表示方法は、それぞれの画面で異なっている
- 色の選択状態は3つの画面で共有されている
- ある画面で色を選択すると、その変更は他の画面へも即座に反映される
- 1つ目の画面では、ボタンをタップして色を変更
- 1つ目の画面では、選択した色が背景色に反映される
- 2つ目の画面では、UISegmentedControlをタップして色を変更
- 2つ目の画面では、選択した色が文字としてラベルに表示される
- 3つ目の画面では、画面をタップする度に色を変更
- 3つ目の画面では、選択した色がcolorViewの背景色に反映される
色を表現するenumを作る
まず、扱う色を表現するenumを1つ作ります。
- UIColor表現を取り出せる「color」
- String表現を取り出せる「text」
- 次の色を取り出せる「next」
を用意しておきます。
import Foundation import UIKit enum Color: Int { case Red case Green case Blue var color: UIColor { switch self { case .Red: return UIColor.redColor() case .Green: return UIColor.greenColor() case .Blue: return UIColor.blueColor() } } var text: String { switch self { case .Red: return "Red" case .Green: return "Green" case .Blue: return "Blue" } } var next: Color { switch self { case .Red: return .Green case .Green: return .Blue case .Blue: return .Red } } }
色を管理するシングルトンを作る
今回は、現在の選択色を管理するためのシングルトンを作ってみました。
import Foundation import Bond class ColorManager { private init() {} static let sharedManager = ColorManager() let color = Observable<Color>(.Red) }
ポイントはlet colorの部分です。Observable<Color>とすることで、変化を監視できるようにします。初期値は.Redとしています。
1つ目の画面を作る
1つ目の画面を作ります。まずは表示から。
ColorManager.sharedManager.color.observe { [weak self] color in self?.view.backgroundColor = color.color }
先ほどシングルトンに持たせた監視可能なcolorを、observeを使って監視しています。
監視対象のcolorが変化したタイミングで、画面のviewの色を更新します。
次は各ボタンをタップした時にやりたいことを記述していきます。
redButton.bnd_tap.observe { ColorManager.sharedManager.color.value = .Red } greenButton.bnd_tap.observe { ColorManager.sharedManager.color.value = .Green } blueButton.bnd_tap.observe { ColorManager.sharedManager.color.value = .Blue }
- redButtonがタップされたら.Redに変更
- greenButtonがタップされたら.Greenに変更
- blueButtonがタップされたら.Blueに変更
という形で記述しています。
ボタンがタップされた時の処理で、viewの更新を行っていない点に注目です。
既に「シングルトンのcolorが変更されたら、画面のviewを更新する」という記述を行っているので必要ないんですね。
2つ目の画面を作る
次は2つ目の画面を作っていきましょう。
ColorManager.sharedManager.color.observe { [weak self] color in self?.colorLabel.text = color.text self?.colorLabel.textColor = color.color self?.colorSegment.selectedSegmentIndex = color.rawValue }
シングルトンのcolorが変更されたら、それに合わせてラベルの文字と色、そしてUISegmentedControlの選択状態を変更しています。
colorSegment.bnd_selectedSegmentIndex.observe { index in guard let color = Color(rawValue: index) else { return } ColorManager.sharedManager.color.value = color }
UISegmentedControlの選択状態が切り替わったら、それに合わせてシングルトンのcolorを更新しています。
3つ目の画面を作る
最後に3つ目の画面を作りましょう。
ColorManager.sharedManager.color.observe { [weak self] color in self?.colorView.backgroundColor = color.color }
シングルトンのcolorが変化したら、それに合わせてcolorViewの色を変更しています。
@IBAction func tap(sender: AnyObject) { ColorManager.sharedManager.color.value = ColorManager.sharedManager.color.value.next }
画面がタップされたら、それに合わせてシングルトンのcolorを次の色に変更しています。
UITapGestureRecognizerのObservableが見当たらなかったのですが、おそらく独自に作ることも可能だと思います(後で調査)。
サンプルコードはこちら
今回作成したプロジェクトはこちらからダウンロードできます ⇒ akio0911/SwiftBondExample
@akio0911はこう思った。
今回のように基礎的な使い方であれば、思っていたよりもかなり扱いが簡単ですね!
(より発展的な使い方になってくると、扱いが難しくなるのかもしれないですけど)
データの変化に合わせたUIの更新を都度行わなくても良いので楽ですね。今作っている個人アプリでSwiftBondを導入したくなってきました。
↓ SwiftBondを使うなら、以下の本でクロージャの使い方について熟知しておいたほうが良いかもしれません。
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!