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