Swift @ObservedObject 用另一个初始化 属性
Swift @ObservedObject initialize with another property
编辑 添加了显示变量声明的源代码
我正在尝试初始化一个视图模型 属性,它是一个 @ObservedObject
@ObservedObject private var viewmodel : ExpenseListViewModel
我想用一个将接受 ManagedObjectContext 作为构造函数中的参数的存储库来初始化视图模型
由于视图模型有一个属性包装器,因此也不允许将其创建为计算 属性。
当我尝试在初始化中初始化存储库和视图模型时,我得到一个在初始化之前使用的自我
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
private (set) var repo: Repository
@ObservedObject private var viewmodel : ExpenseListViewModel
init() {
//let repository = CoreDataRepository(Context: moc)
repo = CoreDataRepository(Context: self.moc)
self.viewmodel = .init(repository: repo)
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
@Environment
在 init 调用阶段不可用,稍后注入。所以这是可能的解决方案:
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
var body: some View {
InternalContentView(context: moc) // context is ready in body
}
struct InternalContentView: View {
@ObservedObject private var viewmodel: ExpenseListViewModel
init(context: NSManagedObjectContext) {
self.viewmodel = .init(repository: CoreDataRepository(Context: context))
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
}
编辑 添加了显示变量声明的源代码
我正在尝试初始化一个视图模型 属性,它是一个 @ObservedObject
@ObservedObject private var viewmodel : ExpenseListViewModel
我想用一个将接受 ManagedObjectContext 作为构造函数中的参数的存储库来初始化视图模型
由于视图模型有一个属性包装器,因此也不允许将其创建为计算 属性。
当我尝试在初始化中初始化存储库和视图模型时,我得到一个在初始化之前使用的自我
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
private (set) var repo: Repository
@ObservedObject private var viewmodel : ExpenseListViewModel
init() {
//let repository = CoreDataRepository(Context: moc)
repo = CoreDataRepository(Context: self.moc)
self.viewmodel = .init(repository: repo)
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
@Environment
在 init 调用阶段不可用,稍后注入。所以这是可能的解决方案:
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
var body: some View {
InternalContentView(context: moc) // context is ready in body
}
struct InternalContentView: View {
@ObservedObject private var viewmodel: ExpenseListViewModel
init(context: NSManagedObjectContext) {
self.viewmodel = .init(repository: CoreDataRepository(Context: context))
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
}