目标是创建一个表,其中的行是不同的类型,每行都是一个“组件”。因此,想象一下Apple教程中的LandmarkRow,但是我们也将展示Accommodations,而不是Landmarks。我想使每个组件都有自己的组件,这一部分很简单。
更具挑战性的部分是如何从每个视图中获取视图(如果它们在集合中)。理想的情况是它们都实现了一个协议,然后我可以将它们包含在包含该协议的类型的集合中,然后仅调用commmon方法,例如buildView。问题是不透明类型似乎破坏了继承。如果我在基础中创建一个build() -> some View
方法,则在派生类中提供实现不被视为替代。所以我不懂派生。相反,现在,我只是在对表视图主体中的每种类型的item是否为Landmark进行操作。
为了非常清楚,我不希望切换或使用if语句块,这是OO 101:我们应该能够派生一个实现协议的新类型,然后将该类型添加到集合中,表是由组成的。
我们确实发现我们可以强制将视图强制转换为协议,然后调用该方法,该方法才有效。优点是不必编辑开关或每次添加新视图时都可以阻止,但仍然是不必要/不正确的。
答案 0 :(得分:0)
由于您都需要它们全部返回相同的类型(符合View
的类型),因此您可能希望它们全部返回AnyView
。
答案 1 :(得分:0)
事实证明,Apple确实提供了解决方案,尽管不是在示例中,而是在“所有设备上的SwiftUI”会话中。在大约26分钟的时间里,他们讨论了提供2个不同的LandmarkRow实现,但是他们不使用继承。他们使用泛型和lambda。资源中没有用于此目的的代码,但是您可以在会话中看到所有代码。