将@ObservedObject作为协议传递给嵌套视图

时间:2020-01-31 17:07:33

标签: swift swiftui

我将用一个小例子更好地解释这个问题:

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

上面的代码没有构建,它给出了错误的错误消息(可能是由于涉及到了闭包): enter image description here

现在,如果出现以下情况,错误就会消失:

  • 我移除了@ObservedObject包装器-不可行,因为我需要观察更改,
  • 或者我更改PersonView来要求具体的类:var employer: Company-但这违反了接口隔离原则
  • 或者我在实例化时添加了额外的.selfPersonView(person: employee, employer: self.company.self)

以上所有都是解决方法,想知道我对父视图的配置是否做错了什么。基本上唯一可行的解​​决方案是第三个解决方案,但是仅添加尾随.self只是为了进行项目构建而感到奇怪。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

通过添加as Employer来使类型明确,并通过Apple反馈来对此进行增强请求(我认为这不一定是Swift问题;我怀疑它与ObservedObject有关)。

PersonView(person: employee, employer: self.company as Employer)