[SwiftUI][Combine] @Published は、Publisher を提供する Property Wrapper

@Published を理解するために、あまり着目したことの無い方向から @Published を考察してみます。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Big Sur 11.2.1
  • Xcode 12.4

@Published

@Published が付与されたプロパティは、更新されるとビューが更新されます。

この説明がよくみる @Published の説明だと思います。

@Published は、Combine フレームワークの一部

Apple のドキュメントを読んで最初に気づくのは、@Published は、SwiftUI ではなく Combine の一部として提供されていることです。

Apple のドキュメントは、こちら

@Published は、Publisher を作る

@Published が役に立つのはビューを更新させたい時だけではありません。

@Published を指定すると、$ (つまり、projectedValue) として、そのプロパティの Publisher にアクセスすることができます。
(property wrapper として、Publisher を作成してくれるということです)

ドキュメントのサンプルにもありますが、以下のように、使うことができます。

Apple のサンプル

変数監視

従来の変数監視

Swiftが当初から持っている変数の監視は、以下のようなものです。

Playground でのチェック

Combine 的変数監視 が @Published

変数監視を Combine的に実装すると この @Published になるということだと思います。

@Published というプロパティラッパーを設定しておくことで、$ 経由でその Publisher に簡単にアクセスでき、sink や assign をすることで、変数監視の実装が可能となります。

複数から監視することも可能なので、さらに便利です。

SwiftUI でのビュー更新

SwiftUI でのビューの更新は、@Published と ObservableObject/@ObservedObject の組み合わせにより実現されています。
ビューの更新は、この Publisher を subscribe することによって実装されています(ハズ)。

Apple のドキュメントは、こちら

ObservableObject に準拠させたクラスは objectWillChange というプロパティ(Publisher)を持ちます。
@Published 指定されたプロパティに変化が起こる直前に objectWillChange に通知され、objectWillChange が Publisher として変化を通知して・・・・

これが、SwiftUI でのビュー更新の背景で起こっていること(のハズ)です。

ちなみに、@Published, ObservableObject, @ObservedObject のうち、@ObservedObject のみが SwiftUI 提供の struct です。

@Published だけでなく、ObservableObject も Combine の提供するものでした。このあたりも興味深いです。

なんとなく、ObservableObject と @ObservedObject がペアな気がしていたのですが、一方は Combine から 他方は SwiftUI から提供されていました。

まとめ:@Published は、変数監視の Combine 実装

@Published は、変数監視の Combine 実装
  • willSet/didSet の Combine 版が @Published
  • SwiftUI でのビューの更新は、@Published/ObservableObject/@ObservedObject の組み合わせで実現されている

すでにそのように理解している人は多いかもしれませんが、改めて考察してみました。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

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