Swift @ObservedObject инициализируется другим свойством - PullRequest
1 голос
/ 03 августа 2020

EDIT добавлен исходный код, показывающий объявление переменных

Я пытаюсь инициализировать свойство модели представления, которое является @ObservedObject @ObservedObject private var viewmodel : ExpenseListViewModel

Я хочу для инициализации модели представления с репозиторием, который будет принимать ManagedObjectContext в качестве параметра в конструкторе

Поскольку модель представления имеет оболочку prperty, она также не позволяет создавать ее как вычисляемое свойство.

когда я пытался инициализировать репозиторий и модель просмотра в init, я получаю, что перед инициализацией используется self

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 )
    }
}

1 Ответ

2 голосов
/ 03 августа 2020

@Environment недоступен на этапе инициализации вызова, он вводится позже. Итак, вот возможное решение:

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 )
        }
    }
}
...