[Combine] 難しそうで難しくない少し難しいCombine

Combine をよく理解したいので、自分なりにまとめてみます。

Reactive Functional Programming ざっくり説明

特徴として挙げられるものは、この言葉だと思います。

ざっくりまとめると、「これまでは、手続きに沿うようにプログラムを作っていましたが、データフローの流れに沿うように記述できるようにします」ということかと。

特徴的な関数としては、map や filter が挙げられるかと思います。

例えば、1から3までの整数の2倍の整数列(つまり、2,4,6という数列)を作ろうとすると以下のようになります。

これまでの考え方で書くと

「これまでの考え方」でいくと、配列があって、その配列のデータを処理していく。さらに追加の処理を行うときは、おそらく、forブロックの後に、別のforブロックを追加していくことになります。

上記を、Reactive Functional Programming 風に書くと以下のようになります。

Reactive Functional Programming風コード

最近の Swift では、いろいろな省略記法が導入されていて、初めての人にはわかりにくくなっていますので、もう少し冗長に記述すると以下のようになります。

Reactive Functional Programming 風だけど省略記法を使用していないコード

「Reactive Functional Programming 的な考え方」でいくと、配列があって、その各要素に、どのような処理を行うかを記述しているイメージです。

つまり、データに対してどのような処理を行うかに着目してコードを記述していることになります。ですので、さらに追加の処理を行う時には、mapの後に、別の処理(例えば、filter)を追加していくことになります。

Combineを理解する上での重要要素

Combine を理解する目での重要要素として、以下が挙げられてます(参考サイトはこちら

  • Publisher と Subscriber
  • Operator

順番に見ていきましょう。

Publisher と Subscriber

技術的には、Publisher,Subscriber はいずれも、Swift の Protocol として定義されています。

Publisher

Subscriber

Publisher は、データ供給側。Subscriber は、データ受領側 ということになります。
先の例では、(1…3)が、Publisher/データ供給側となっています。

厳密には、Publisher には、Output Type の他に、Failure Type というものが定義され、出力されることがあります。

エラーが発生した時に渡されるものです。

同様に、Subscriber には、Input Type の他に、Failure Type というものが定義され、入力として受け取ることがあります。

どのような Publisher/Subscriber があるかは、上記のAppleのページの最後 Relationships というセクションに記載があります。

Operator

データフロー上流側から渡された値を加工して、あと工程に渡すものです。 

この辺りがデータフローに着目している特徴を表しています。

先の例では、map が該当しています。(今回の例では、渡された値を2倍にして、あと工程に渡す動作をしています)

Operators には、map, flatMap, filter, reduce 等が存在します。詳細は、Appleのページでどうぞ。

この Operators を何段にも重ねることで複雑な処理を行わせることが可能となります。例えば、あと工程に渡したくないデータは、filter を使って、除去することができますし、reduce を使うと、データフロー全体でデータを共有して処理することもできます。

面白い例:Subject

Publisher の特別な場合を表すもので、Swift の Protocol として定義されていて、Publisher にも Conform しているものです。

この Subject の面白い点は、Publisher の外部から、Publish をコントロールできる点です。

普通、Publisher は、自分の都合(?)で値を Publish しますが、Subject で備えられている send というメソッドを使って、外部から Publish させることができるようになっています。

これまでの資産を Combine 的にリライトする時には、よく使われる気がします。

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です