Передать @ObservedObject в качестве протокола для вложенного представления - PullRequest
1 голос
/ 31 января 2020

Я лучше объясню проблему на небольшом примере:

struct Person: Identifiable {
    var id: Int
    var name: String
}

class Company: ObservableObject {
    @Published var employees = [Person]()

    func hire(person: Person) { }
}

protocol Employer {
    func hire(person: Person)
}

extension Company: Employer { }

struct CompanyView: View {
    @ObservedObject var company: Company

    var body: some View {
        List(company.employees) { employee in
            PersonView(person: employee, employer: self.company)
        }
    }
}

struct PersonView: View {
    var person: Person
    var employer: Employer

    var body: some View {
        Text(person.name)
    }
}

Приведенный выше код не создается, он выдает crypti c сообщения об ошибках (вероятно, из-за задействованных замыканий): enter image description here

Теперь ошибки go исчезают, если либо:

  • Я удаляю оболочку @ObservedObject - это невозможно, так как мне нужно соблюдать изменяется,
  • , или я изменяю PersonView, требуя конкретного класса: var employer: Company - но это нарушает принцип разделения интерфейса
  • , или я добавляю дополнительный .self при создании экземпляра: PersonView(person: employee, employer: self.company.self)

Все вышеперечисленное является обходным путем, интересно, что я делаю что-то не так с конфигурацией родительского представления. По сути, единственное жизнеспособное решение - это третье, но кажется странным, что нужно добавить завершающий .self только для сборки проекта.

Есть ли лучшее решение?

1 Ответ

1 голос
/ 31 января 2020

Сделайте тип явным, добавив as Employer, и откройте запрос на улучшение в Apple Feedback (я не думаю, что это обязательно проблема Swift; я подозреваю, что она связана с ObservedObject).

PersonView(person: employee, employer: self.company as Employer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...