前回の記事「ReactiveCocoaはじめの一歩: 3分でできるReactiveCocoa」ではとりあえずてきとうなアプリを作ってみました。
今回はこれとは別に、関数型言語のようなmapやfilterを使ったアプリを作ってみます。
実装
前回とあまり変わらない手順です。てきとうにテキストフィールドを貼って、IBOutletで接続します。
そしてviewDidLoad
にコードを追加するだけです。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. RAC(self, upperLabel.text) = [[self.textField.rac_textSignal filter:^BOOL(NSString* value) { return value.length >= 3; }] map:^id(NSString* value) { return value.uppercaseString; }]; }
rac_textSignal
上記コードには新たに追加されたキーワードがいくつかあるので、それを見ていきましょう。
まず、5行目のself.textField.rac_textSignal
は意味的にはRACObserve(self, textField.text)
と同様です。
なぜこのようなものを利用しなければならないかと言うと、UIKitは基本的にKVOをサポートしていないからです。
そのため、ReactiveCocoaではRACSignalSupportというカテゴリで、UITextFieldにいくつかのメソッドを追加しています。それらのメソッドのひとつであるrac_textSignalではテキストの変化イベントを発生を見てテキストを取得するようなことを行っています。
なお、名前にsignalと付いているのは、このメソッドがクラスRACSignal
を返すからです (RACObserve
もRACSignal
を返す)。
シグナルの詳細については次回以降で説明します。
filterとmap
続いて6行目では、関数型言語のようなfilter
をします。rac_textSignalから編集した文字列が遅られてくるので、それを次の処理に渡すかどうかを真偽値で返します。
ここでは、value.length >= 3;
としているので3文字以上なら次の処理map
に入ります。
8行目のmap
も関数型言語の同様の働きで、ここでは入力として与えられる文字列を大文字にして返します。
最終的には前回のようにRAC(self, upperLabel.text)
に代入しているので、テキストフィールドの文字列が3文字以上なら大文字に変換されてラベルのテキストになる処理になっていることがわかります。
結果
というわけで、アプリを実行して、3文字以上入力したときはラベルの文字が大文字のものが表示されるようになります。例えば次のようになります。
おわりに
ReactiveCocoaでmapやfilterを利用してみました。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。