SwiftBondを使ってみた。observeやObservableの使い方など

公開日: : 最終更新日:2020/07/09 iOSアプリ開発

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

20160525-233821.jpg

Swiftバインディングフレームワークである「SwiftBond」を使ってみました!

小さなサンプルを作ってみたので、それを使ってSwiftBondの使い方を簡単に紹介したいと思います。

    

「何かが起こったら、それに合わせて何かをしたい」を実現できる

SwiftBondはまだ少ししか使っていないのですが、いまのところ分かっているのは「何かが起こったら、それに合わせて何かをしたい」を簡単に実現できる仕組みなんだなあ、ということ。

他にも便利な側面があるのかもしれませんが、僕にとっては上記の仕組みだけでも十分に便利だと感じました。

    

今回作ってみたサンプルの内容

20160525-234612.jpg

  • タブによって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を使うなら、以下の本でクロージャの使い方について熟知しておいたほうが良いかもしれません。

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

この記事が気に入ったら「いいね!」しよう

Twitterで更新情報をゲット!

PAGE TOP ↑