【问题标题】:Type '()' cannot conform to 'View' - SwiftUI类型“()”不能符合“视图” - SwiftUI
【发布时间】:2022-07-05 22:01:20
【问题描述】:

我最近开始了一个初学者项目,我遇到了这个烦人的错误。基本上我想循环完成一些任务,获取每一个进度并总结它。

 import Foundation
    import SwiftUI
    
    class sums: ObservableObject{
        @Published var sum: Double = 0
        @EnvironmentObject var listViewModel: ListViewModel
        
        func sums2()->Double{
            ForEach(listViewModel.items){item in
                sum += item.test
            }
            return sum
        }
    }

【问题讨论】:

  • 这不是那个ForEach,是view的view容器,使用for in,或者reduce,或者.forEach等。

标签: swift swiftui


【解决方案1】:

ForEach 是一个 SwiftUI 视图,设计用于循环遍历一组对象,然后为每个对象呈现 SwiftUI 视图。

您的代码似乎正在寻找的是遍历一个数组,并从每个数组中添加一个值。这是一个针对您的数据而不是您的 UI 的功能,可以使用纯 Swift 来实现。

Swift 提供了几个循环选项:for...in.forEach。前者对于您可能需要跳过选项或提前退出循环的情况很有用;使用.forEach,您始终可以访问集合中的每个元素。对于您的情况,.forEach 符合要求。

let sum = 0
listViewModel.items.forEach { item in 
  sum += item.test
}
return sum

就一般编程而言,我不太清楚为什么您将sum 声明为属性,然后拥有一个更新该属性并返回值的函数。感觉就像你在混合视图模型、辅助方法和视图的概念,会给你带来各种各样的麻烦。

根据视图模型的设置方式,在其中声明一个方法来处理求和可能更容易:

class ListViewModel: ObservableObject {
  @Published var items: ItemType

  func sum() -> Double {
    let sum = 0
    items.forEach { sum += $0.test }
    return sum
  }
}

“循环遍历一个集合并根据所有集合返回单个值”的模式非常常见,我们有一个 Swift 函数 reduce,它可以帮助我们:

func sum() -> Double {
  items.reduce(0) { (accumulator, item) in 
    accumulator + item.test
  }
  // or in shorthand
  items.reduce(0) { $0 + $1.test }
}

祝您在接下来的学习中好运,并记住将您的视图与您的数据分开!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多