类型 'any View' 不符合泛型协议'View'



我使用一个协议来定义一个覆盖到默认的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协议的专门版本,其中BodyCalculationComponent<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")
}
}
}

}

最新更新