在 ForEach 循环中调用函数

Posted

技术标签:

【中文标题】在 ForEach 循环中调用函数【英文标题】:Call Function within ForEach Loop 【发布时间】:2020-11-15 09:09:19 【问题描述】:

我只是想在 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)")
                
            
        
    

【问题讨论】:

ForEach 是一个视图容器,而不是一个控制流。在 body 之外的某个地方使用标准 swift for in 【参考方案1】:

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

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

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

然后你可以像这样在body 中使用它:

 Text("Walks:\(walksCount)")

【讨论】:

以上是关于在 ForEach 循环中调用函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析

PHP foreach循环里面调用函数,需要等函数返回成功才能进入下一次循环,怎么弄呢?

R:foreach 循环如何找到应该调用的函数?

在 foreach 循环中提交表单并仅使用其数据调用 ajax 函数 mvc 4

在 foreach 循环中找不到函数

循环内的异步函数完成后如何调用函数?