SwiftUI中"Type '()' cannot conform to 'View'"报错原因及疑问
解决SwiftUI中"Type '()' cannot conform to 'View'"错误
错误核心原因
你写的chartAverage()和chartActual()函数没有声明返回类型,Swift中无返回值的函数默认返回Void(也就是()),但SwiftUI的容器(比如VStack)里只能放遵循View协议的对象,所以编译器抛出这个错误。
另外你的chartAverage()还有两个额外问题:
@Environment(\.colorScheme)不能直接定义在普通函数内部,必须放在承载body的View结构体里- 函数内部没有明确返回View的逻辑(哪怕写了Chart代码,但没返回,编译器仍会判定它返回Void)
修正步骤
- 给函数添加返回类型:把函数声明改成
func chartAverage() -> some View,Swift单表达式函数可省略return,多表达式则要确保最后一行是要返回的View - 移动环境变量到结构体:把
@Environment(\.colorScheme) var scheme移到包含body的View结构体顶部 - 调整函数内部逻辑:移除函数里的环境变量定义,直接使用结构体里的
scheme
修正后的代码示例
struct YourView: View { @Environment(\.colorScheme) var scheme // 环境变量移到这里 @State private var isLineGraph = false var body: some View { VStack{ if isLineGraph { chartAverage() } else { chartActual() } } } // 修正后的chartAverage函数 func chartAverage() -> some View { let cloudCoverArray: [CloudCoverArray] = GlobalVariables.masterCloudCover Chart { ForEach(cloudCoverArray, id:\.self) {item in LineMark( x: .value("Date", item.date), y: .value("CloudCover", item.averageCloud), series: .value("Date", "CloudCover") ) .foregroundStyle(Color.gray) .lineStyle(StrokeStyle(lineWidth: 2)) } } .padding() .frame(width: GlobalVariables.screenWidth - 32, height: 340 + 30) .clipShape(RoundedRectangle(cornerRadius: 15)) .background { RoundedRectangle(cornerRadius: 10, style: .continuous) .fill((scheme == .dark ? Color.black : Color.white).shadow(.drop(radius: 2))) } } // chartActual()也要做同样修正:添加返回类型,确保返回View func chartActual() -> some View { // 你的chartActual实现代码,最后返回一个View Text("Actual Chart") } }
为何只报错第一个函数
编译器是从上到下检查代码的,当它发现第一个不符合要求的chartAverage()时就会抛出错误,不会继续检查后面的chartActual()。但实际上两个函数存在同样的问题,所以替换后还是会报错。
内容的提问来源于stack exchange,提问作者Edward Hasted
相关产品推荐
相关产品推荐

