我将用一个小例子更好地解释这个问题:
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
只是为了进行项目构建而感到奇怪。
有更好的解决方案吗?
答案 0 :(得分:1)
通过添加as Employer
来使类型明确,并通过Apple反馈来对此进行增强请求(我认为这不一定是Swift问题;我怀疑它与ObservedObject有关)。
PersonView(person: employee, employer: self.company as Employer)