首页 > 解决方案 > 在 ForEach 循环中调用函数

问题描述

我只是想计算适合 ForEach 循环中“if”语句的事件数,但出现以下错误。

我尝试了几种变体来完成这项任务,但每种变体都导致了一些描述错误。我要补充一点,我是一个苦苦挣扎的新手!

类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议

我现在正在使用的代码。

import Foundation
import SwiftUI
import EventKit

class Summary: ObservableObject {
    @Published var walkCount:Int = 0
    @Published var dayCareCount:Int = 0
    @Published var shortStayCount:Int = 0
    @Published var longStayCount:Int = 0
    @Published var dropInCount:Int = 0
}

struct SummaryView: View {
    
    @ObservedObject var eventsRepository = EventsRepository.shared
    @ObservedObject var selectDate = datepicker()
    var summary: Summary
    
    enum BookingType {
        case walk
        case dayCare
        case shortStay
        case longStay
        case dropIn
    }
    
    func countBooking(bookingType: BookingType) {
        switch bookingType {
        case .walk:
            summary.walkCount += 1
        case .dayCare:
            summary.dayCareCount += 1
        case .shortStay:
            summary.shortStayCount += 1
        case .longStay:
            summary.longStayCount += 1
        case .dropIn:
            summary.dropInCount += 1
        }
    }
    
    var body: some View {
        
        GroupBox {
            
            VStack{
                
                //Walks
                HStack{
                    
                    ForEach(eventsRepository.events ?? [], id: \.self) { event in
                        
                        if event.title.contains("Walk") {
                            
                            countBooking(bookingType: .walk) // running function results in error
                            
                        }
                    }
                    
                    Text("Walks:\(summary.walkCount)")
                }
            }
        }
    }
}

标签: foreachswiftui

解决方案


ForEach旨在用于构建重复内容,body仅用于定义您View不用于执行任何计算。

计算步行次数的最简单方法是在 SummaryView 内部但在外部声明一个计算属性body

var walksCount: Int {
    eventsRepository.events?
        .filter { $0.title.contains("Walk") }
        .count ?? 0
}

然后你可以像这样在里面使用它body

 Text("Walks:\(walksCount)")

推荐阅读