SwiftUIのサンプルコードなどをみているとよく出てくるのが、@Publishedという属性。今回はこの属性について解説していきます。
今回説明する内容はXcode12.5を使用して動作を確認しています。
@Publishedとは
@PublishedはiOS13以上でサポートされていて、Combineフレームワークの一部として提供されているProperty wrapperです。
@PublishedはObservableObjectプロトコルに準拠したクラス内のプロパティを監視し、変化があった際にViewに対して通知を行う役目があります。@Stateに近い機能と言えるでしょう。以下のような使い方をします。
class UserInfo: ObservableObject {
@Published var firstName: String = ""
@Published var lastName: String = ""
}
struct ContentView: View {
@ObservedObject var userInfo = UserInfo()
var body: some View {
VStack {
Text("フルネーム:\(userInfo.lastName) \(userInfo.firstName)")
TextField("姓", text: $userInfo.lastName)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 300)
.padding()
TextField("名", text: $userInfo.firstName)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 300)
.padding()
}
}
}
もう一つの機能として、@Publishedを付与するとprojectedValueとしてプロパティのPublisherにアクセスできるという機能があります。
Appleの公式ドキュメントを見てみましょう。
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
// Prints:
// Temperature now: 20.0
// Temperature now: 25.0
Weatherクラスのプロパティ temperature に@Publishedが付与されていますね。そのtemperetureに対してsinkを使ってsubscribeすることで、値の変化を監視しようとしているのがわかります。
上記のコードを見て気づいている方もいるかもしれませんが、@Publishedはクラス内のプロパティに付与することができます。structなどの値型では付与できません。
ざっくりとですが、今回は@Publishedについて説明しました。気が向いたらもう少し詳しい内容をかく加えるかも。
コメント