背景
我有一个泛型SwiftUI View
,它有两个泛型类型,第一个需要手动指定,而第二个可以通过传递给它的Initialiser
的内容来推断。
然而,Compiler
迫使我在使用视图时手动指定两个泛型类型,这导致了非常复杂的定义,如下面的示例所示。
代码
protocol Entity {
static var name: String { get }
}
struct EntityView<E: Entity, Content: View>: View {
private let content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
VStack {
Text(E.name)
content
}
}
}
struct ContentView {
var body: some View {
EntityView<Profile, TupleView<(HStack<EmptyView>, HStack<EmptyView>, Text)>> { // This is obviously not clean to define manually.
HStack { ... }
HStack { ... }
Text("Hello World")
}
}
}
问题
是否有任何“更干净”的方法来实现这个功能?是否有可能以某种方式只定义无法推断的泛型类型?
1条答案
按热度按时间iezvtpos1#
Swift需要推断 * 所有 * 类型参数,或者必须显式指定 * 所有 * 类型参数。
Swift推断类型参数的一个地方是参数列表,因此,要使它也“推断”
E
,添加一个包含E.Type
的参数。然后,在使用视图时,传递
Profile.self
: