【Swift UI/Combine】@Publishedとは?プロパティの監視と使い方
この記事からわかること
- SwiftのCombineフレームワーク
- @Publishedの使い方
- クラスのプロパティを監視する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swift UIでクラスのプロパティの変更を監視するために使用する@Published属性についてどのようなものなのかまとめていきます。
@Publishedとは?
@propertyWrapper struct Published<Value>
@Published
とは非同期処理やデータバインディングなどための機能を提供するCombineフレームワークに属するプロパティラッパです。Swift UIでは@ObservedObjectとセットで使用するイメージが強いですが、もちろん単体でも役割を持っています。
おすすめ記事:【Swift UI】@ObservedObjectの意味と使い方!クラスとプロトコルとの関係
@Publishedの役割は指定したプロパティのPublisherを発行することです。PublisherはCombineフレームワークの肝部分であり状態変換(データなど)検知し通知を出す存在です。それをSubscriber(サブスクライバー)が購読することで値の変化時に任意の処理を施したり、状態変化に応じた処理を実行させることができます。
おすすめ記事:【Swift UI】Combineフレームワークの使い方!PublisherとSubscriberの違い
@Publishedは@State
と同じく変更を検知するとViewの再レンダリングが行われます。また内部的にはwillSet
でobjectWillChange
のsend
メソッドを呼び出されているため検知のタイミングは値が変更される直前になります。
おすすめ記事:【Swift】プロパティオブザーバとは?willSetとdidSetの使い方
使い方
@Published
はプロパティラッパなのでクラスのプロパティを宣言時のvarやletの前に付与します。クラスにのみ使用できるように制約がかけられているので構造体では使用できません。
class Weather {
@Published var temperature: Double
init(temperature: Double) {
self.temperature = temperature
}
}
Publisherとして操作する
@Published
の公式ドキュメントを見るとPublisherとしての使用例が記述されています。
class Weather {
@Published var temperature: Double
init(temperature: Double) {
self.temperature = temperature
}
}
let weather = Weather(temperature: 20)
cancellable = weather.$temperature
.sink() {
print ("Temperature now: \($0)")
}
weather.temperature = 25
上記の例ではPublisherとなったプロパティからsink
メソッドを呼び出すことでサブスクライバーを登録しています。これでプロパティの値の変更が観測されたタイミングでサブスクライバーとして登録された任意の処理を実行させることができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。