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

公開日: : iPhoneアプリ開発

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

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

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

20141222-120336.jpg

【Swift】PlaygroundでUIImageに画像を読み込む方法

SwiftのPlayground内にて、UIImageに画像ファイルを読み込む方法を紹介しま

記事を読む

20141027-113224.jpg

【Swift】「詳解 Objective-C 2.0 第3版」の著者による「詳解Swift」が予約受付中!

「詳解 Objective-C 2.0 第3版」の筆者「荻原 剛志」さんによる新しい技術書「詳細

記事を読む

I20160417-171311.jpg

Xcodeのブレークポイントで変数の中身を通知センターに表示してみる

Xcodeのブレークポイントの機能を使って、ブレークポイントを通過した時点での変数の中身を通知セ

記事を読む

I20160130-110811.jpg

【解決】Redundant conformance of ‘NSDate’ to protocol ‘Comparable’エラーが出た時の対処方法

アプリ開発中に「Redundant conformance of 'NSDate' to pro

記事を読む

20150108-113233.jpg

【Swift】コードをコンパクトに記述できるオプショナルチェーン(optional chaining)の性質と活用例

最近はSwiftでコーディングすることが多い@akio0911です。今日はSwiftでコード

記事を読む

I20151119-165939.jpg

Swift 2.1に対応した本「詳解 Swift 改訂版」が出るぞ!

Swiftの文法に関する解説書の定番「詳解 Swift」の、Swift2.1に対応した改訂版「詳

記事を読む

I20150907-185322.jpg

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」

株式会社マイナビ様より献本御礼。 本書は、公式のUIフレームワーク「Unity UI(uGUI

記事を読む

I20151107-111928.jpg

Swift 2で要求バージョンの指定・実行環境バージョンの確認を行う(#availableと@available)

Swift 2で追加された#available, @availableの使い方についてメモしてお

記事を読む

20141224-231137.jpg

【Swift】Auto Layoutで特定のデバイス・画面サイズの時だけ制約を変更する方法

Auto Layoutで、特定のデバイスや画面サイズの時だけ制約を変更する方法について紹介したい

記事を読む

I20160119-155700.jpg

Xcodeで80文字目のところにガイドラインを表示する方法

Xcodeで80文字目のところに線(ガイドライン)を表示する方法について解説します! 「ソース

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑