SwiftUIにおけるObservedObjectとは?
SwiftUIには、ClassのほかにStructというビュー構造体があり、このビュー構造体でUIを記述するのが特徴です。これまでのGUIでのビュー構成と違い、シンプルで論理的にUIが記述できるのが特徴です。
ObservedObjectとは
SwiftUIのClassには、ObservedObjectというプロトコルがあり、Classでこれを宣言することにより、ObservedObjectプロトコルを宣言したClassで@Publishedとして指定したvarが変化したときに、ビュー構造体内のビューを再描画するという仕組みがあります。
例:
class ScrollViewManager: ObservableObject {
@Published var cellContents: [CellContent] = []
@Published var scrollViewHeight: CGFloat = 0
ビュー構造体側では、これを以下のように受けます。
ケース1:Classをインスタンスとして生成する場合:
この場合、@StateObjectとしてインスタンスを生成し、letでこれを初期化します。
struct makidenliteApp: App {
@StateObject private var displayManager = DisplayManager()
init() {
let displayManager = DisplayManager()
}
ケース2:他でインスタンス化されたものを利用する場合
この場合、次のように記述します。
struct ContentView: View {
@ObservedObject var displayManager: DisplayManager
@ObservedObject var scrollViewManager: ScrollViewManager
init(displayManager: DisplayManager, scrollViewManager: ScrollViewManager){
self.displayManager = displayManager
self.scrollViewManager = scrollViewManager
}
これで@ObservedObjetとして指定したClassの@Publised変数が変更となったときに、body以下で記述されたビューが再描画されるという仕組みになります。
それで静的なビュー構造に、他で記述された動的な要素を持ち込むということができるわけです。
はじめはClaude3.5の言われるままにコピーしていましたが、ムダなインスタンスを作ったりメチャクチャになったので勉強してすっきり、という感じです。ではでは。