🌾

[Swift] [Combine] ObservableObject でなくても @Published は使用できる件

2022/02/24に公開

サンプルコード

@PublishedObservableObject はセットで使うものだと誤解されがちですが、そうではありません。

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 が必要となります。

つまり、ObservableObjectSwiftUI での 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 の使い所について紹介しております。

GitHubで編集を提案

Discussion