@Publishedってなに?-SwiftUI

Swift

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について説明しました。気が向いたらもう少し詳しい内容をかく加えるかも。

コメント

タイトルとURLをコピーしました