繁体   English   中英

类型“任何视图”不能符合具有泛型的协议上的“视图”

[英]Type 'any View' cannot conform to 'View' on protocol with generics

我正在使用协议来定义对默认View协议的覆盖,以在我的应用程序中创建一些模板化视图。 对于大部分布局,它们都将共享相同的CalculationComponent视图,但随后将实现不同的按钮/控件,这些按钮/控件通过使用泛型的@ViewBuilder传递。

我遇到的问题是,在定义我的协议主体时,泛型类型会引发错误,其中Type 'any View' cannot conform to 'View' 我认为这与CalculationComponent上的<Content: View>部分直接有关

计算组件.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")
            }
        }
    }
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM