SwiftのCombineを知る
本記事では、WWDC2019にて発表されたCombineを大まかに解説します。
WWDC2019にて、“Combine”という新しいフレームワークが発表されました。Combineとは、アプリがイベントをどのように処理するのかを、宣言的に書くことのできるAPIです。要するに、ReactiveSwiftやRxSwiftのような、関数型リアクティブプログラミング(FRP)のフレームワークです。
FRPとは、ベルトコンベアに似ています。たくさん発行される値を監視しつつ、その流れの中で自分の欲しいものだけフィルタリングしたり、欲しい形に加工したりできます。
Combineでは、値を発行する側をPublisher, 値を受け取る側をSubscriber, 値を加工したり制御したりする部分をOperatorといいます。実際に使い方を見てみましょう。
Publisher
まずは、値を監視してベルトコンベアに流してくれるPublisherを作ります。通知の発生を監視する場合と、値の変更を監視する場合の2つに分けて説明します。
TextFieldに対する入力時やアプリのバックグラウンド移動時などに発生する通知を監視したい場合には、NotificationCenterを用います。以下のようにすることで、textFieldから発生するtextDidChangeNotification
を監視することができます。
BoolやStringなどの値の変更を監視したい時もありますね。そんな時は、@Published
という修飾子を頭につけてあげます。これはその変数のPublisherを作ってくれるもので、$
をつけると扱うことができます。$
をつけなければ元の型で利用することができるので、非常に便利です。
Operator
Publisherで監視を始めたら、Operatorを繋いで自分の欲しい値に修正していきましょう。様々なOperatorがありますが、もっとも使うのは.map(_:)
になるでしょう。これは、受け取った値を別の値に変換することができます。たとえば先ほどのTextFieldのPublisherからはNotification型の値が流れてくるので、.map(_:)
を用いてStringを流すベルトコンベアに変えましょう。
OperatorはPublisher自体をカスタマイズすることもできます。.filter(_:)
で条件に当てはまる値だけを流すようにしたり、.removeDuplicates()
で重複した値を続けて流さないようにしたりできます。.receive(on:)
を用いてメインスレッドに処理を移すこともできるので、結果をUIの更新などに利用するのも簡単です。
Subscriber
欲しい値を受け取れるようになったら、最後は流れてきた時の処理を書きましょう。.sink(receiveValue:)
で値を受け取ることができます。
単に結果を別の変数に代入したいのであれば、.assign(to:on:)
を使うことで非常にスマートに処理を記述できます。
以上がWWDC2019にて新たに発表されたCombineの概要です。標準ライブラリでFRPができるようになるのは非常にお手軽で嬉しいですね!便利なオペレータが用意されていたり、SwiftUIとの連携もできたりするようなので、正式リリースが待ち遠しいです 😘
参考文献