类型“()”不能符合 'View'

Type '()' cannot conform to 'View'

抱歉,我对 SwiftUI 还是个新手,我正在为在视图中输出随机字符串而苦苦挣扎。由于我得到的错误“Type '()' cannot conform to 'View”,我了解到 View 不是写下函数本身的合适位置。我应该怎么做才能输出itemX.randomElement()和itemY.randomElement()。 感谢任何帮助。

struct SummaryView: View {
    var avgValue = 1.5
    var roundedKarvonenValue: Double
    var itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
    var itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]

    var body: some View {
            ScrollView {
                VStack(alignment: .leading) {
                    if workoutManager.averageHeartRate < roundedKarvonenValue{
                        print(itemX.randomElement()!)
                    }else{
                        print(itemY.randomElement()!)
                    }

这个问题有很多东西要解压,但我们先从简单的开始。 Views 用于在屏幕上显示内容。而已。 print() 语句出现问题的原因是它们用于打印到控制台,而不是屏幕。因此,编译器会报错。要解决此问题,请使用 Text 就像@JoakimDanielson 所说:

struct SummaryView: View {
    var workoutManager: WorkoutManager //This var must be declared
    
    var avgValue = 1.5
    var roundedKarvonenValue: Double
    var itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
    var itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]
    
    var body: some View {
        ScrollView {
            VStack(alignment: .leading) {
                if workoutManager.averageHeartRate < roundedKarvonenValue{
                    Text(itemX[0])
                } else {
                    Text(itemY[0])
                }
            }
        }
    }
}

至于你的第二部分关于在哪里放置你的功能,没有那么明确。您应该查看 MVVM 架构以了解在 SwiftUI 中构建应用程序的标准方式。现在,您只是使用 Apple 的 WWDC class WorkoutManager(我想)显示来自 HealthKit 的数据。

在最基本的层面上,如果您的功能与更改数据的显示方式有关,它会保留在 View 中。如果该函数从根本上改变了您的 Model 或多个视图需要它,它应该进入 Model。这是一个判断电话。

因此,对于您的代码,您要显示视图中声明的变量中的随机元素。那都是本地的东西,所以该功能保留在视图中。添加 func randomElement() 并进一步清理您的代码,您将得到以下结果:

struct SummaryView: View {
    // If you are not changing the variables, declare them as constants. This uses less memory.
    let workoutManager: WorkoutManager
    let avgValue = 1.5
    let roundedKarvonenValue: Double
    let itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
    let itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]
    
    var body: some View {
        ScrollView {
            VStack(alignment: .leading) {
                // I turned your if statement into a Terniary Conditional Operator to shrink the amount of code.
                Text(workoutManager.averageHeartRate < roundedKarvonenValue ? randomElement(itemX) : randomElement(itemY))
            }
        }
    }
                     
    func randomElement(_ stringArray: [String]) -> String {
        let end = stringArray.count - 1
        let index = Int.random(in: 0...end)
        return stringArray[index]
    }
}

您可以像这样在视图中使用打印语句:

     if workoutManager.averageHeartRate < roundedKarvonenValue{
       let _ = print(itemX.randomElement()!)
     }else{
       let _ = print(itemY.randomElement()!)
     }