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コード)

関連記事

20141210-164612.jpg

【Swift】Generated Header内にSwiftクラスの定義が記述されない場合の確認事項【Xcode6】

Swiftで書いたクラスをObjective-Cで使う際には、「Generated Header

記事を読む

I20151103-131550.jpg

iPhoneアプリ開発にオススメの本7選(初心者向け含む)2015年11月版

Xcode 7/Swift 2/iOS 9に対応した関連書籍が揃ってきたので、iPhoneア

記事を読む

20150327-131839.jpg

【Apple Watchアプリ】ボタン内の文字の先頭に画像を入れる方法【WatchKit】

Apple Watch向けのアプリを作るためのフレームワーク「WatchKit」。そのWatch

記事を読む

I20150724-135442.jpg

iPhoneのホーム1画面目に置いているオススメなアプリ38本(2015年9月版)

2014年7月に「iPhoneアプリ開発にオススメの本10選(2014年7月版)」という記事

記事を読む

20150108-113233.jpg

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

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

記事を読む

I20160418-235604.jpg

XcodeのStoryboardで部品を選択しやすくする2つの方法

ストーリーボード上で部品が入り組んでくると選択しづらくなってきますが、そんな状況でも部品を選択し

記事を読む

I20160129-115948.jpg

【対処法】Swift 2(iOS 9)ではUITextFieldのtextがString?になっている

Swift 1(iOS 8)時代において、UITextFieldのtextプロパティは va

記事を読む

20140807-182914.jpg

【アプリ開発】iOS 8とiOS 7でUIAlertController・UIAlertView・UIActionSheetを切り替えて使う方法

@akio0911です。今までお世話になったUIAlertViewとUIActionShee

記事を読む

20140818-141439.jpg

iPhoneアプリを作りたい開発初心者にまずはやってみて欲しい3つのこと

今日は、これからiPhoneアプリを作りたい開発初心者の方にやってもらいたいことを書いてみた

記事を読む

I20160210-140020.jpg

【Xcode】モーダル表示で遷移先へ値を渡す時のハマりポイント

モーダル表示で遷移先の画面へ値を渡す際、最初はハマりやすいポイントについて解説したいと思いま

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

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で、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑