2013/12/03

ReactiveCocoaでmap, filterなどを使ってみる

前回の記事「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を返すからです (RACObserveRACSignalを返す)。

シグナルの詳細については次回以降で説明します。

filterとmap

続いて6行目では、関数型言語のようなfilterをします。rac_textSignalから編集した文字列が遅られてくるので、それを次の処理に渡すかどうかを真偽値で返します。

ここでは、value.length >= 3;としているので3文字以上なら次の処理mapに入ります。

8行目のmapも関数型言語の同様の働きで、ここでは入力として与えられる文字列を大文字にして返します。

最終的には前回のようにRAC(self, upperLabel.text)に代入しているので、テキストフィールドの文字列が3文字以上なら大文字に変換されてラベルのテキストになる処理になっていることがわかります。

結果

というわけで、アプリを実行して、3文字以上入力したときはラベルの文字が大文字のものが表示されるようになります。例えば次のようになります。

おわりに

ReactiveCocoaでmapやfilterを利用してみました。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。