【Swift/Combine】AnyPublisherの使い方と役割!eraseToAnyPublisher

この記事からわかること

  • SwiftCombineフレームワーク使い方
  • AnyPublisher使い所役割
  • 実装サンプル
  • eraseToAnyPublisherメソッドの使い方
  • 型消去を行うメリット

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

SwiftのCombineフレームワークとは非同期処理やストリーム処理、データのバインディング、イベントハンドリングなどのリアクティブプログラミングに倣った機能を提供しているApple純正のフレームワークです。

AnyPublisherとは?

公式リファレンス:

@frozen
struct AnyPublisher<Output, Failure> where Failure : Error

CombineのAnyPublisher別のパブリッシャーをラップすることで型を消去して公開するパブリッシャーです。AnyPublisher自体には重要なプロパティを持たず上流のパブリッシャーからのイベントをそのまま通過させて公開する役割を持っています。

eraseToAnyPublisherメソッド

公式リファレンス:eraseToAnyPublisher

public func eraseToAnyPublisher() -> AnyPublisher<Self.Output, Self.Failure>

型を消去してAnyPublisher型を受け取るためにはPublisherプロトコルの持つeraseToAnyPublisherメソッドを使用します。パブリッシャー機能を持ったクラスはPublisherプロトコルに準拠しているので上流とするパブリッシャーから呼び出すことができます。

このメソッドを実行することで上流のパブリッシャーのイベントを遮断することなくデータ型を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のみを参照できるメリットはPassthroughSubjectsendメソッドが自由に呼び出せないようになっていることです。

このように上流のパブリッシャーの持つ独自のメソッドなどを外部に公開する必要がない場合に型消去して公開することで期待しない独自メソッドの呼び出しを防ぐことができます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index