Swift遇Cannot convert Int.Type to expected argument type Int报错如何解决
问题原因&解决方案
1. 预览报错修复
你遇到的两个预览报错本质是同一个问题:构造视图实例时,你传入的是Int、String这类类型本身,而编译器要求你传入对应类型的具体值。
直接替换对应预览代码即可:
KarvonenCalc(CalcProcess)预览修复
注意你的视图定义名是CalcProcess,如果是命名笔误改为对应即可,预览需要传入所有无默认值的参数的具体值:
struct CalcProcess_Previews: PreviewProvider { static var previews: some View { // 传入Age、ExerciseIT、RHR的测试数值即可 CalcProcess(Age: 25, ExerciseIT: 6, RHR: 55) } }
SummaryView预览修复
给KarvonenVal传入任意测试用的字符串即可:
struct SummaryView_Previews: PreviewProvider { static var previews: some View { SummaryView(NumAdded4: .constant(false), KarvonenVal: "138.2") } }
2. 传值失效&布局问题修复
你现有代码存在两个隐藏问题会导致传值失败/跳转异常:
- 变量名冲突:顶部
@State声明的KarvonenVal是Int类型,body内又重新定义了同名的String局部常量,容易引发类型不匹配错误 - 布局层级错误:
NavigationLink放在VStack外层,和VStack并列,SwiftUI的body仅支持返回单个根视图,会导致跳转逻辑失效
修改后的CalcProcess完整代码:
struct CalcProcess: View{ @EnvironmentObject var workoutManager: WorkoutManager @State var NumAdded4 = false @State var Age:Int @State var ExerciseIT:Int @State let ConstantNumber = 220 @State var RHR:Int func karvonen(cn: Int, rhr: Int, age: Int, ei:Double) -> Double { return Double((cn-age-rhr)) * (ei / 10) + Double(rhr) } var body: some View { let output = karvonen(cn: ConstantNumber, rhr: RHR, age: Age, ei: Double(ExerciseIT)) let roundedDouble = Double(round(1000*output)/1000) let formattedKarvonenVal = String(format: "%.1f", roundedDouble) VStack{ Text("\(formattedKarvonenVal)") .foregroundStyle(.black) // NavigationLink放到VStack内部,作为子视图 NavigationLink( destination: SummaryView(NumAdded4: $NumAdded4, KarvonenVal: formattedKarvonenVal), isActive: $NumAdded4, label: { Text("Next") } ) } } }
3. SummaryView参数校验
确保SummaryView的KarvonenVal参数类型为String,和传入值类型匹配即可:
struct SummaryView: View { @Binding var NumAdded4: Bool // 类型和传入的格式化字符串保持一致 var KarvonenVal: String var body: some View { // 直接使用即可显示 Text("计算结果:\(KarvonenVal)") } }
内容的提问来源于stack exchange,提问作者Epicminetime
相关产品推荐
相关产品推荐

