SwiftUI报错Generic parameter 'C0' could not be inferred,求解决方法
嘿,我帮你找到了这个泛型推断错误的根源,咱们一步步来搞定它!这个错误本质上是SwiftUI没法识别某个View的类型,而问题就出在你的ContentView代码里一个很容易忽略的小细节上。
问题核心定位
先看这段有问题的代码:
VStack() { .textFieldStyle(RoundedBorderTextFieldStyle()) // 这里根本没有对应的TextField组件! Text("INPUT: \(code)") .font(Font.custom("Roboto Mono", size: CGFloat(20))) }
.textFieldStyle是专门给TextField用的修饰符,你现在直接把它丢在VStack里,没有附着在任何TextField上,SwiftUI完全不知道这个修饰符该作用在谁身上,自然就抛出了泛型参数无法推断的错误。
修复步骤
1. 补上缺失的TextField
你已经定义了@State private var code,正好把它和TextField绑定起来,这样修饰符就有了对应的目标:
VStack() { TextField("Enter code", text: $code) // 新增这个TextField .textFieldStyle(RoundedBorderTextFieldStyle()) // 现在修饰符有地方呆了 .font(Font.custom("Roboto Mono", size: 20)) Text("INPUT: \(code)") .font(Font.custom("Roboto Mono", size: 20)) }
2. 删掉不必要的强制解包
代码里多处出现CGFloat(0)!、CGFloat(20)!这种写法,其实CGFloat的初始化永远不会返回可选值,这些!完全是多余的,还可能埋下崩溃隐患。直接改成数字或者不带!的CGFloat就行,甚至Swift会自动帮你推断类型,比如:
// 原来的写法 .frame(minWidth: CGFloat(0)!, maxWidth: .infinity, minHeight: CGFloat(0)!, maxHeight: .infinity, alignment: Alignment.topLeading) // 改成这样更简洁安全 .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
3. 修正Button的方法调用
你的EliminationModel里的printTest是实例方法,现在你用EliminationModel.printTest()调用是不行的,得用你创建的实例eliminationModel来调用:
Button(action: { self.eliminationModel.printTest() }) { Text("Button") }
如果想直接用结构体名调用,那得把方法改成静态的:static func printTest(),不过现在用实例调用更符合你的代码结构。
修复后的完整ContentView代码
import SwiftUI struct ContentView: View { var eliminationModel = EliminationModel() @State private var code: String = "0000" let roboto = UIFont(name: "Roboto Mono", size: UIFont.systemFontSize) var body: some View { ZStack() { Image("background") .resizable() .edgesIgnoringSafeArea(.all) VStack() { HStack() { VStack() { Text("CODE:") .font(Font.custom("Roboto Mono", size: 15)) .multilineTextAlignment(.center) Text("6969") .font(Font.custom("Roboto Mono", size: 10)) .padding(.top, 10.0) Button(action: { self.eliminationModel.printTest() }) { Text("Button") } } .padding(.horizontal, 50.0) VStack() { TextField("Enter code", text: $code) .textFieldStyle(RoundedBorderTextFieldStyle()) .font(Font.custom("Roboto Mono", size: 20)) Text("INPUT: \(code)") .font(Font.custom("Roboto Mono", size: 20)) } } .padding([.top, .leading, .trailing], 20.0) Spacer() HStack() { VStack() { Text("YOUR TARGET IS: ") .font(Font.custom("Roboto Mono", size: 25)) .padding(.bottom, 11.0) Text("JOHN APPLESEED") .font(Font.custom("Roboto Mono", size: 40)) .fontWeight(.black) .foregroundColor(Color.gray) .multilineTextAlignment(.center) Image("headshot") .cornerRadius(10.0) } } Spacer() HStack() { VStack(alignment: .center) { Text("GRADE: ") .font(Font.custom("Roboto Mono", size: 15)) .multilineTextAlignment(.center) Text("FACULTY") .font(Font.custom("Roboto Mono", size: 20)) } VStack(alignment: .center) { Text("DORM: ") .font(Font.custom("Roboto Mono", size: 15)) .multilineTextAlignment(.center) Text("DAY") .font(Font.custom("Roboto Mono", size: 20)) } } Spacer() } .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
小提示
以后再遇到SwiftUI的泛型推断错误,优先检查最近修改的View代码块:有没有遗漏组件?修饰符是不是没附着在正确的View上?View的返回类型是不是明确?这些都是这类错误的常见诱因。
内容的提问来源于stack exchange,提问作者Spencer Michaels

