温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Composability with types in SwiftUI
swiftui

其他 - SwiftUI中类型的可组合性

发布于 2020-03-27 11:00:54

目标是要有一个表,其中的行是不同的类型,每行都是一个“组件”。因此,想象一下Apple教程中的LandmarkRow,但我们也将展示Accommodations,而不是Landmarks。我要使每个组件都有自己的组件,这一部分很简单。

更具挑战性的部分是如何从每个视图中获取视图(如果它们在集合中)。理想的情况是,如果它们都实现了一个协议,然后可以将它们包含在包含该协议的类型的集合中,然后仅调用commmon方法,例如buildView。问题是不透明类型似乎破坏了继承。如果我build() -> some View在基础中创建一个方法,则不能将在派生类中提供实现视为替代。所以我不懂派生。相反,现在,我只是在对表视图主体中的每种类型的item为Landmark进行操作。

只是非常清楚,我不需要开关或if语句块,它是OO 101:我们应该能够派生一个实现协议的新类型,然后将该类型添加到表组成的集合中的。

我们确实发现可以强制将视图强制转换为协议,然后调用有效的方法。优点是不必每次添加新视图时都必须编辑开关或阻塞,但仍然是不必要/不正确的。

查看更多

查看更多

提问者
Rob
被浏览
66
Rob 2019-07-05 23:01

事实证明,Apple确实提供了解决方案,尽管不是在示例中,而是在“所有设备上的SwiftUI”会话中。在大约26分钟的时间里,他们讨论了提供2个不同的LandmarkRow实现,但是他们不使用继承。他们使用泛型和lambda。资源中没有与此相关的代码,但是您可以在会话中看到所有代码。