【问题标题】:Type '()' cannot conform to 'View'类型 '()' 不能符合 'View'
【发布时间】:2021-11-24 17:33:01
【问题描述】:

对不起,我还是 SwiftUI 的新手,我在努力在视图中输出随机字符串。由于我得到的错误“类型'()'不符合'视图”,我了解到视图不是写下函数本身的合适位置。我应该怎么做才能输出 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()!)
                    }

【问题讨论】:

标签: swift swiftui view watchos


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这个问题有很多内容需要解开,但我们先从简单的开始。 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]
        }
    }
    

    我显然无法对此进行测试,因为您没有提供足够的代码。请参阅How to create a Minimal, Reproducible Example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多