【问题标题】:Call Function within ForEach Loop在 ForEach 循环中调用函数
【发布时间】: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

标签: foreach swiftui


【解决方案1】:

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

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

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

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

 Text("Walks:\(walksCount)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多