Swift bond コードリーディング

23
Swift Bond コードリーディング 2015.11.05 中原瞬

Transcript of Swift bond コードリーディング

Swift Bondコードリーディング

2015.11.05 中原瞬

アジェンダ

● Reactive Programing とは

● Swift Bond とは

● Swift Bond のよく使うメソッド

● observe● EventProducer● Swift Bond を読んで気になった実装を紹介

Reactive Programming とは...時間や外部の入力とともに変化する値や計算を、ユーザ自身がプログラムするのでは

なく、システム(言語自体やライブラリ)がユーザからは見えないところで反応(reactive)してくれるというものです。

print される値は?

var a = 1var b = a + 1a = 10print b

bに直接値を代入する処理を書いていないがa の値を変えることで bの値も間接的に書きかわる

var a = 1var b = a + 1a = 10print b → 11

Swift Bond は...1. UI オブジェクトと ViewModel を繋いでデーターのやりとりをしてくれる

2. 繋いだデーターは Reactive な振る舞いを行ってくれる

3. 関数型プログラミングをサポート

4. UILabel や UITableView など標準なクラスを拡張して作られている

5. ジェネリクスや拡張などSwift の良い機能を使いまくっている

Swift Bond のよく使うメソッド

bindToEventProducerType:bindTo

※オブジェクトから作用させたいオブジェクトをbind したい時に利用する

例)動的に値が変わった時に、入力欄も更新

bidirectionalBindToEventProducerType:bidirectionalBindTo

※双方向に bind したい時に利用する

例)動的に値が変わった時に、入力欄も更新

その逆の、入力欄の値をユーザーが書き換えたらシステム上の値を更新

observeNewEventProducerType:observeNew

※データが更新された時に変更の値で何か処理を行いたい時に使用

例)動的に値が変わった時に、エラーチェックなどを行いたいなど

Swift Bond を読んで気になった実装

今回の内容を実装に組み込んだらかっこいいwww?

bindToってどういう仕組みになっているん?

loginModel.userName.bindTo(userNameTextField.bnd_text)

この一行を調べていたら、いくつかの実装を発見!!

Wherespublic func bindTo<B : BindableType where B.Element == EventType> (bindable: B) -> DisposableType

public func bindTo<B : BindableType where B.Element == Optional<EventType>> (bindable: B) -> DisposableType

Phantom Typepublic func bindTo<B : BindableType where B.Element == EventType> (bindable: B) -> DisposableType

public func bindTo<B : BindableType where B.Element == Optional<EventType>> (bindable: B) -> DisposableType

NSRecursiveLock

複数スレッドから非同期でアクセスされた時に、同時アクセスをブロックしてくれる。

(排他制御処理)

NSRecursiveLock

処理を囲むことで、スレッドセーフな処理を簡単に切り出すことができる。

NSRecursiveLock

private let lock = NSRecursiveLock(name: "com.xxx.yyyy")...lock.lock()...lock.unlock()

objc_setAssociatedObject / objc_getAssociatedObject

既存のクラスを継承せずに、クラスに値(機能)を追加することができる。

objc_setAssociatedObject

/** * Sets an associated value for a given object using a given key and association policy. * * @param object The source object for the association. * @param key The key for the association. * @param value The value to associate with the key key for object. Pass nil to clear an existing association. * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.” * * @see objc_setAssociatedObject * @see objc_removeAssociatedObjects */@available(iOS 3.1, *)public func objc_setAssociatedObject( object: AnyObject!, _ key: UnsafePointer<Void>, _ value: AnyObject!, _ policy: objc_AssociationPolicy)

objc_getAssociatedObject

/** * Returns the value associated with a given object for a given key. * * @param object The source object for the association. * @param key The key for the association. * * @return The value associated with the key \e key for \e object. * * @see objc_setAssociatedObject */@available(iOS 3.1, *)public func objc_getAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>) -> AnyObject!