SwiftUI 中类型的可组合性

Composability with types in SwiftUI

目标是 table 行是不同类型的,每行都是一个 'component.' 所以想象一下 Apple 教程中的 LandmarkRow,但我们也将使用 Landmarks 而不是也显示住宿。我想把每一个都做成自己的组件,那部分很简单。

更具挑战性的部分是我如何从每个视图中获取视图(如果它们在一个集合中)。理想的情况是,如果它们都实现一个协议,然后我可以将它们放入包含该协议的类型集合中,然后只调用 commmon 方法,例如构建视图。问题是不透明类型似乎破坏了继承。如果我在基础中创建 build() -> some View 方法,则在派生的 类 中提供实现不会被视为覆盖。所以我没有得到派生。相反,现在,我只是在 table 视图主体中的每种类型的项目是否为地标。

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

组成

我们确实发现我们可以强制将视图转换为协议,然后调用该方法,这很有效。优点是不必在每次添加新视图时都编辑开关或 if 块,但仍然 unnecessary/incorrect.

由于您需要它们全部 return 相同类型(符合 View 的类型),您可能希望它们全部 return AnyView.

事实证明 Apple 确实提供了解决方案,虽然不是在示例中,而是在会话中 'SwiftUI on All Devices.' 他们讨论了大约 26 分钟,提供 2 种不同的 LandmarkRow 实现,但他们不使用继承。他们使用泛型和 lambda。资源中没有这方面的代码,但您可以在会话中看到它。