在 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循环里面调用函数,需要等函数返回成功才能进入下一次循环,怎么弄呢?