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

Epi*_*ime 27 view swift watchos swiftui

我正在努力在视图中输出随机字符串。

由于错误:

类型 '()' 不能符合 '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()!)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mum*_*ain 35

您可以在视图中使用 print 语句,如下所示:

VStack(alignment: .leading) {
    if workoutManager.averageHeartRate < roundedKarvonenValue {
        let _ = print(itemX.randomElement()!)
    } else {
        let _ = print(itemY.randomElement()!)
    }
}
Run Code Online (Sandbox Code Playgroud)


Yrb*_*Yrb 13

这个问题有很多东西需要解开,但我们首先从简单的开始。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])
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至于你的第二部分,即在哪里放置你的函数,并不是那么明确。您应该查找 MVVM 架构,以了解在 SwiftUI 中构建应用程序的标准方法。现在,您只是显示HealthKit使用 Apple WWDC 的数据class WorkoutManager(我猜)。

在最基本的层面上,如果您的函数与更改数据的显示方式有关,那么它会保留在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]
    }
}
Run Code Online (Sandbox Code Playgroud)