【Swift/Combine】AnyPublisherの使い方と役割!eraseToAnyPublisher
この記事からわかること
- SwiftのCombineフレームワークの使い方
- AnyPublisherの使い所と役割
- 実装サンプル
- eraseToAnyPublisherメソッドの使い方
- 型消去を行うメリット
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
SwiftのCombineフレームワークとは非同期処理やストリーム処理、データのバインディング、イベントハンドリングなどのリアクティブプログラミングに倣った機能を提供しているApple純正のフレームワークです。
AnyPublisherとは?
@frozen
struct AnyPublisher<Output, Failure> where Failure : Error
CombineのAnyPublisher
は別のパブリッシャーをラップすることで型を消去して公開するパブリッシャーです。AnyPublisher自体には重要なプロパティを持たず上流のパブリッシャーからのイベントをそのまま通過させて公開する役割を持っています。
eraseToAnyPublisherメソッド
public func eraseToAnyPublisher() -> AnyPublisher<Self.Output, Self.Failure>
型を消去してAnyPublisher
型を受け取るためにはPublisher
プロトコルの持つeraseToAnyPublisher
メソッドを使用します。パブリッシャー機能を持ったクラスはPublisher
プロトコルに準拠しているので上流とするパブリッシャーから呼び出すことができます。
このメソッドを実行することで上流のパブリッシャーのイベントを遮断することなくデータ型をAnyPublisher
に変換(型消去)して公開することができるようになります。
具体的なサンプルコード
言葉では分かりにくいので具体的なサンプルコードにしていみます。
- 上流のパブリッシャー:PassthroughSubject
- 公開するパブリッシャー:AnyPublisher
class Test {
// 上流のパブリッシャーを作成
private let customPublisher = PassthroughSubject<Int, Never>()
// 型を消去したAnyPublisherを公開
public func getPublisher() -> AnyPublisher<Int, Never> {
customPublisher.eraseToAnyPublisher()
}
// 上流のパブリッシャーの持つイベント発行メソッドを実行
public func sendEvent(_ num: Int) {
customPublisher.send(num)
}
}
let test = Test()
// 型消去されたパブリッシャー(AnyPublisher)を取得
let publisher: AnyPublisher = test.getPublisher()
// 購読開始
let cancellable = publisher.sink { value in
print("値は:", value)
}
// 上流パブリッシャーのイベントを発行
test.sendEvent(1)
test.sendEvent(2)
上記の例ではPassthroughSubject
が上流となっておりますが、公開(外部から参照できる)パブリッシャーはAnyPublisher
にすることができています。AnyPublisher
のみを参照できるメリットはPassthroughSubject
のsend
メソッドが自由に呼び出せないようになっていることです。
このように上流のパブリッシャーの持つ独自のメソッドなどを外部に公開する必要がない場合に型消去して公開することで期待しない独自メソッドの呼び出しを防ぐことができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。