🌾
[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