我使用一个协议来定义一个覆盖到默认的View
协议,在我的应用程序中创建一些模板化的视图。它们都将为大部分布局共享相同的CalculationComponent
视图,但随后将实现不同的按钮/控件,通过使用泛型的@ViewBuilder
。
我遇到的问题是,在定义我的协议体时,泛型类型抛出错误,其中Type 'any View' cannot conform to 'View'
。我认为这与CalculationComponent
<Content: View>
部分有直接关系。CalculationComponent.swift
struct CalculationComponent<Content: View>: View {
@Binding var mainCalculation: String
@Binding var secondaryCalculation: String
@ViewBuilder var content: () -> Content
var body: some View {
// Template UI here
content()
}
}
CalculationView.swift
protocol CalculationView: View {
var mainCalculation: String { get set }
var secondaryCalculation: String { get set}
var body: CalculationComponent<View> { get } // Type 'any View' cannot conform to 'View'
}
CalculatorView.swift
struct CalculatorView: CalculationView {
@State internal var mainCalculation: String = ""
@State internal var secondaryCalculation: String = ""
var body: CalculationComponent {
CalculationComponent(
mainCalculation: $mainCalculation,
secondaryCalculation: $secondaryCalculation
) {
Text("Buttons and view content here")
}
}
}
如果我理解正确的话,您需要View
协议的专门版本,其中Body
是CalculationComponent<some View>
,并且您不想明确地写什么"some View
";是在符合协议的情况下,加上一些其他要求。
可以为CalculationView
添加一个关联的类型,
protocol CalculationView: View {
associatedtype Content: View
var mainCalculation: String { get set }
var secondaryCalculation: String { get set}
var body: CalculationComponent<Content> { get } // Type 'any View' cannot conform to 'View'
}
,然后说CalculationComponent<some View>
,当符合协议:
struct CropFactorCalculatorView: CalculationView {
@State internal var mainCalculation: String = ""
@State internal var secondaryCalculation: String = ""
var body: CalculationComponent<some View> {
CalculationComponent(
mainCalculation: $mainCalculation,
secondaryCalculation: $secondaryCalculation
) {
VStack {
Text("Some Text")
Text("Some Other Text")
}
}
}
}