【问题标题】:Cannot convert value of type 'Int.Type' to expected argument type 'Int' - Swift无法将“Int.Type”类型的值转换为预期的参数类型“Int” - Swift
【发布时间】:2021-11-23 14:23:04
【问题描述】:

我在这里尝试做的是使用 NavigationLink 将“KarvonenVal”的值移动到 SummaryView。

struct CalcProcess: View{
    @EnvironmentObject var workoutManager: WorkoutManager

    @State var NumAdded4 = false
    @State var Age:Int
    @State var ExerciseIT:Int
    @State var ConstantNumber = 220
    @State var RHR:Int
    @State var KarvonenVal = 1
    
    
    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 KarvonenVal: String = String(format: "%.1f", roundedDouble)
           
        VStack{
            Text("\(KarvonenVal)")
                .foregroundStyle(.black)
        }
        NavigationLink(destination: SummaryView(NumAdded4: $NumAdded4, KarvonenVal: KarvonenVal), isActive: $NumAdded4, label: {Text("Next")})
        }
    }
}


struct KarvonenCalc_Previews: PreviewProvider {
    static var previews: some View {
        KarvonenCalc(KarvonenVal: Int)
    }
}

但是,我在“KarvonenCalc_Previews”中不断收到错误消息,显示“无法将 'Int.Type' 类型的值转换为预期的参数类型 'Int'”。我真的被困在这里,无法在 SummaryView 中显示 KarvonenVal。

struct KarvonenCalc_Previews: PreviewProvider {
    static var previews: some View {
        KarvonenCalc(KarvonenVal: Int)
    }
}

同样在 SummaryView_Preview 中,我收到了类似的错误消息“无法将 'String.Type' 类型的值转换为预期的参数类型 'String'”。

struct SummaryView_Previews: PreviewProvider {
    static var previews: some View {
        SummaryView(NumAdded4: .constant(false), KarvonenVal: String)
    }
}

【问题讨论】:

  • 您需要提供实际的IntString,例如0"hi"
  • 我明白了。但随后 KarvonenVal 会根据输入值而变化。
  • 预览就是这样,一个预览,你可以看到你的用户界面会是什么样子。所以这个值不是那么相关,它是恒定的,不依赖于任何输入。
  • 根据命名约定以小写字母开头命名您的变量 - 正如您之前问题的答案中所建议的那样 - 您会立即注意到这个问题。您需要一个常量值而不是类型。这就是错误所说的。
  • 离题,但属性和变量名称以小写字母开头,避免局部变量和属性使用相同的名称,这会使代码更难阅读和理解。

标签: swift swiftui swiftui-previews


【解决方案1】:

如果您使用变量/常量,将它们小写是惯例。对于类型,它们是大写的。

所以使用“karvonenVal”而不是“KarvonenVal”。您还使用了两个同名的属性:

let KarvonenVal: String = String(format: "%.1f", roundedDouble)

在体内和

@State var KarvonenVal = 1

就在上面作为你的结构属性,所以编译器可能对使用哪一个感到困惑,因为它们都是大写的,它把它读作“类型”而不是属性。

您需要做的是解决“KarvonenVal”之间的名称冲突(将其中一个重命名为“KarvonenVal0”或您喜欢的任何名称)并使所有属性名称小写。

对于预览,您必须提供默认值才能使其正常工作。它基本上是在要求您输入一些整数,而您要给它整数类型。换句话说,它要求的是“一个对象”,而你却给了它一个“类”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多