尝试使用泛型类型来初始化/添加到另一个SwiftUI视图时,会出现错误“Type 'T' has no member 'init'”。如何解决这个问题?我猜问题在于View只是需要一个body属性而已,没有其他限制。但是应该使用什么类型呢?
简单的例子: 尝试使用TrippleView,它应该创建/显示三个类型为T的视图,添加视图(RedRectView或BlueCircleView)没有问题。但将这些视图作为泛型参数传递失败了。
简单的例子: 尝试使用TrippleView,它应该创建/显示三个类型为T的视图,添加视图(RedRectView或BlueCircleView)没有问题。但将这些视图作为泛型参数传递失败了。
struct SomeView: View {
var body: some View {
TrippleView<RedRectView>()
TrippleView<BlueCircleView>()
}
}
struct TrippleView<T: View>: View {
var body: some View {
VStack {
// Does NOT work: Type 'T' has no member 'init'
T()
T()
T()
// Works fine
// RedRectView()
// BlueCircleView()
// RedRectView()
}
}
}
struct RedRectView: View {...}
struct BlueCircleView: View {...}
编辑:
TrippleView
只是一个示例。我想像其他通用类型一样使用通用视图:在不同的场景下,它们都可以作为共同的基础“类型”。
例如,两个版本的列表视图,它们使用通用的 CellView
在两种不同的样式/布局中显示相同的数据。
T
符合View
协议,而View
协议又没有声明该初始化程序,那么你如何期望T()
起作用呢?你需要创建自己的协议,符合View
,并在其中声明你想要的初始化程序,然后您可以将其用作T
的要求,并且您会知道您的视图可以通过这种方式初始化。 - EmilioPelaez