温馨提示:本文翻译自stackoverflow.com,查看原文请点击:swift - Pass @ObservedObject as protocol to nested view
swift swiftui

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

发布于 2020-04-07 11:07:20

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

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

上面的代码没有构建,它给出了错误的错误消息(可能是由于涉及到闭包): 在此处输入图片说明

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

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

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

有更好的解决方案吗?

查看更多

提问者
Cristik
被浏览
108
Rob Napier 2020-02-01 01:16

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

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