Я лучше объясню проблему на небольшом примере:
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 сообщения об ошибках (вероятно, из-за задействованных замыканий): 
Теперь ошибки go исчезают, если либо:
- Я удаляю оболочку
@ObservedObject
- это невозможно, так как мне нужно соблюдать изменяется, - , или я изменяю
PersonView
, требуя конкретного класса: var employer: Company
- но это нарушает принцип разделения интерфейса - , или я добавляю дополнительный
.self
при создании экземпляра: PersonView(person: employee, employer: self.company.self)
Все вышеперечисленное является обходным путем, интересно, что я делаю что-то не так с конфигурацией родительского представления. По сути, единственное жизнеспособное решение - это третье, но кажется странным, что нужно добавить завершающий .self
только для сборки проекта.
Есть ли лучшее решение?