SlideShare a Scribd company logo
ReactiveCocoaを
かじってみた
#iOS_LT
!

田村 孝文
ReactiveCocoaって何?
•

「リアクティブプログラミング」のObjective-C実装の一つ
•

•

https://github.com/ReactiveCocoa/ReactiveCocoa

リアクティブプログラミングって何?
「なぜリアクティブプログラミングは重要か。」http://d.hatena.ne.jp/pokarim/20101226 から引用:

•

『 リアクティブプログラミングは、「時間とともに変化する値」
=「振る舞い」同士の関係性を記述することでプログラミングを
行うパラダイムです。

GUIなどのようにインタラクティブなシステムや、シミュレーションやアニメーションの
ようにダイナミックに状態が変化するようなシステムを宣言的に記述することができます

これらの「変化する状態」や「外部とのやりとり」が支配的なシステムは、純粋関数型言語が、その強みを
発揮しにくい部分でもあります。

うんたらかんたら∼∼∼ほにゃほにゃ∼∼∼』

・・・うん、なるほど。よく分からん!
というわけで
•

よく分かってないけどしゃべります。

•

今日話をする順番
•

パラダイムとしての「リアクティブプログラミング」の話(超ざっ
くり)

•

ライブラリとしての「ReactiveCocoa」を実際に使ってみた話
•

Target/Action方式とReactiveCocoa方式を見比べる

•

ReactiveCocoaでしか出来ない(であろう)方式
リアクティブプログラミングを
絵を見て分かった気になる
関数として定義
↓

「値と値の関係性」を関数として記述するプログ
ラミングスタイル、っぽい、みたいな?感じ?
引用 http://d.hatena.ne.jp/pokarim/20101226
リアクティブプログラミングを
仮想言語で分かった気になる

a=1
b=a*3
a=2
print(b) ←ここで何が出てくる?
• 命令型なら
• bは3のまま ← a*3が計算された時のまま
• リアクティブプログラミングでは
• bが6になってる ←「bはaの3倍」という関係性を定
義しているので、bの値はaの値が変更されたら自動
で再計算され、自動で再代入されている(?)
•

Excelのセルに書いたマクロのような感じ
ReactiveCocoaを使ってみる:
作ってみるアプリ
ユーザ作成画面を想定	




	createボタンは以下の条件を満たしたら有効

•

になる(ルール1)

	

◦	 username,emailが空でない


	

◦	 passwordとpasswordVerificationが同
じ


	

◦	 passwordは8文字以上


	 •	 passwordとpasswordVerificationが違う場
合とpasswordが8文字以下の場合は、
Labelに警告が表示される(ルール2)


!

→TextFieldの状態が変わったら、メッ
セージとボタンの状態が変わる。
ReactiveCocoaを使ってみる:
Target/Action方式(1)

•

見慣れた構成

•

ルールは、ViewControllerのメソッドとして持つ
ReactiveCocoaを使ってみる:
Target/Action方式(2)

https://github.com/taktamur/RACSample/blob/master/RACSample/TargetActionViewController.m
ReactiveCocoaを使ってみる:
ReactiveCocoa方式(1)

•
•

構成としてはほぼ同じ
ルールは、RACSignalオブジェクトが持つ
• RAC =ReactiveCocoa のprefix
ルールはblockで記述
ルールの記述にUIヘの参照が無い
•

•
ReactiveCocoaを使ってみる:
ReactiveCocoa方式(2)

UIのバインド

ルールの実装

結果をバインド

https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController.m
ReactiveCocoaを使ってみる:
ここまでの実装で気になる点
•

ルール1とルール2に、重複する部分がある
•

createボタンは以下の条件を満たしたら有効になる(ルール1)

•
•

passwordとpasswordVerificationが同じ


•
•

username,emailが空でない

passwordは8文字以上


passwordとpasswordVerificationが違う場合とpasswordが8文字以下の場合
は、Labelに警告が表示される(ルール2)


•

このルールの分離はTarget/Action方式ではやりにく
いけど、ReactiveCocoaなら可能!

•

→RACSignalの連鎖が可能
ReactiveCocoaを使ってみる:
RACSignalの連鎖(1)

https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController2.m
ReactiveCocoaを使ってみる:
RACSignalの連鎖(2)
別で作ったSignalを
元データとして
バインドしている

Signalが連鎖するような書き方は
標準では出来ない(ですよね?)
https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController2.m
まとめ
•

パラダイムとしての「リアクティブプログライング」は魅力的
•

•

テンポラリ的な「変数(状態)」が不要なので、矛盾が発生しにくい。再計
算は言語やランタイム、ライブラリが自動で行う。関数型言語っぽい。

ライブラリとしての「ReactiveCocoa」は難物←今時点での田村評価
•

•

•

利点:ビジネスロジックをSignalとして分離出来る。またSignalの連鎖を
使って、ビジネスロジックを「単純なルールの組み合わせ」に分解出来る。
UIとロジックの分離が可能。
欠点:難解。Objective-Cと馴染んでいない。ライブラリが超ヘビー級。

同じアイデアを、もっとObjetive-Cに馴染んだ形で、ライトに実装さ
れたものがあればそれが欲しい。←無ければつk(ry
ご清聴
ありがとうございました。
•

このLTの原稿

http://qiita.com/paming/items/9ac189ab0fe5b25fe722

More Related Content

Reactive cocoaをかじってみた。