🌾
[Swift] [Combine] ObservableObject でなくても @Published は使用できる件
サンプルコード
@Published
と ObservableObject
はセットで使うものだと誤解されがちですが、そうではありません。
ObservableObject をつけた場合
ObservableObject
をつけると @StateObject
、@ObservedObject
、@EnvironmentObject
のアノテーションをつけた変数で使用可能になります。
import SwiftUI
// ObservableObject をつける
class Hoge: ObservableObject {
@Published private(set) var mogmoge: Int = 0
}
// コンパイルエラーにはならない🌟
class Piyo {
@StateObject var hogeStateObject = Hoge()
@ObservedObject var hogeObservedObject = Hoge()
@EnvironmentObject var hogeEnvironmentObject: Hoge
}
また@StateObject
、@ObservedObject
、@EnvironmentObject
を使用には import SwiftUI
が必要となります。
つまり、ObservableObject
は SwiftUI
での View の実装で使うものになります。
(間違っておりましたらご指摘のほどお願いいたします🙇♂️)
ObservableObject を外した場合
ObservableObject
を外すと @StateObject
、@ObservedObject
、@EnvironmentObject
のアノテーションをつけた変数で使用できなくなります。
import SwiftUI
// ObservableObject を外す
class Hoge {
@Published private(set) var mogmoge: Int = 0
}
// コンパイルエラーとなる😭
class Piyo {
@StateObject var hogeStateObject = Hoge() // Generic struct 'StateObject' requires that 'Hoge' conform to 'ObservableObject'
@ObservedObject var hogeObservedObject = Hoge() // Generic struct 'ObservedObject' requires that 'Hoge' conform to 'ObservableObject'
@EnvironmentObject var hogeEnvironmentObject: Hoge // Generic struct 'EnvironmentObject' requires that 'Hoge' conform to 'ObservableObject'
}
『Generic struct 'StateObject' requires that 'Hoge' conform to 'ObservableObject'
』とこんな感じで怒られてしまいます。
結論
ObservableObject
を適応した class でなくても@Published
は使用できる-
ObservableObject
は@StateObject
、@ObservedObject
、@EnvironmentObject
のアノテーションをつけた変数を使いたいときに使用する =SwiftUI
での View の実装で使用する
以上になります。
続編
以下の記事でそんな ObservableObject
ではない @Published
の使い所について紹介しております。
Discussion