これが私たちが住んでいるこの勇敢な新しいSwiftUIの世界のアンチパターンであるかどうかはわかりませんが、基本的には、ビューに呼び出せるいくつかの基本的なユーザー情報が保存された@EnvironmentObjectがあります。
このビューに必要なデータを所有する@ObservedObjectもあります。
ビューが表示されたら、@ EnvironmentObjectを使用して@ObservedObjectを初期化します。
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
残念ながら、初期化が完了するまで、環境変数に対してselfを呼び出すことはできません。
「プロパティ初期化子内でインスタンスメンバー 'userData'は使用できません。'self 'が使用可能になる前にプロパティ初期化子が実行されます。」
私はいくつかの可能なルートを見ることができますが、それらはすべてハックのように感じます。私はこれにどのように取り組むべきですか?
サブビューを作成する代わりに、ダミーの初期化子を"ViewObject"
に追加して、実際の初期化子を呼び出す前に呼び出すことができます。
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject
init() {
viewObject = ViewObject()
defer {
viewObject = ViewObject(id: self.userData.UID)
}
}
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
記録のために、私はそれをテストしていません
簡単な方法は次のとおりです。
struct MyCoolView: View {
@EnvironmentObject var userData: UserData
var body: some View {
Observe(obj: ViewObject(id: userData.UID)) { viewObject in
Text("\(viewObject.myCoolProperty)")
}
}
}
それを機能させるこのヘルパーで:
struct Observe<T: ObservableObject, V: View>: View {
@ObservedObject var obj: T
let content: (T) -> V
var body: some View { content(obj) }
}