Как и где выполнить итерацию по массиву объектов для получения многоразовых итогов - PullRequest
0 голосов
/ 09 мая 2020

Как мне перебрать массив объектов, чтобы получить итоги, которые будут использоваться в моих представлениях. Во-вторых, где мне запустить эту функцию, чтобы полученные итоги можно было повторно использовать в других частях приложения?

Я пытаюсь использовать метод массива reduce(_:_:), но не знаю, лучший ли это подход.

Мне нужно суммировать общее количество студентов в каждом классе. т.е. в 10 классе 2 ученика. В 11 классе учится 1 ученик. В 12 классе учится 3 ученика.

Я уже какое-то время зацикливаюсь на этом. Спасибо!

    import SwiftUI

    struct Student: Identifiable {
        let id: String
        let name: String
        let gradeLevel: Int
    }

    class GetStudents: ObservableObject {
        @Published var items = [Student]()

        init() {
            self.items = [
                Student(id: "aa1", name: "Bobby", gradeLevel: 12),
                Student(id: "aa2", name: "Tommy", gradeLevel: 11),
                Student(id: "aa3", name: "Susy", gradeLevel: 10),
                Student(id: "aa4", name: "Billy", gradeLevel: 12),
                Student(id: "aa5", name: "Jimmy", gradeLevel: 12),
                Student(id: "aa6", name: "Johnny", gradeLevel: 10),
            ]
        }
    }

    struct ContentView: View {

        @ObservedObject var students = GetStudents()

        var body: some View {

            VStack {

                Text("Total Students: \(self.getTotal())")

                // Here is where I'm stuck, need total per gradeLevel derived from array

                Text("Total Per Grade Level")

                // Grade10 2
                // Grade11 1
                // Grade12 3

                List {

                    ForEach(students.items) { student in

                        HStack {

                            Text("Name: \(student.name)")
                            Spacer()
                            Text("Grade: \(student.gradeLevel)")

                        }
                    }
                }

            }

        }

        private func getTotal() -> Int {

            return self.students.items.count

        }

    }

    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }

1 Ответ

2 голосов
/ 09 мая 2020

Вот ваш класс полностью обновлен, чтобы отображать количество учеников по классам в вашем интерфейсе:

import SwiftUI

struct Student: Identifiable {
    let id: String
    let name: String
    let gradeLevel: Int
}

class GetStudents: ObservableObject {
    @Published var items = [Student]()
    @Published var grouped = Dictionary<Int, [Student]>()

    init() {
        self.items = [
            Student(id: "aa1", name: "Bobby", gradeLevel: 12),
            Student(id: "aa2", name: "Tommy", gradeLevel: 11),
            Student(id: "aa3", name: "Susy", gradeLevel: 10),
            Student(id: "aa4", name: "Billy", gradeLevel: 12),
            Student(id: "aa5", name: "Jimmy", gradeLevel: 12),
            Student(id: "aa6", name: "Johnny", gradeLevel: 10),
        ]

        self.grouped = Dictionary(grouping: self.items, by: { (element: Student) in
            return element.gradeLevel
        })

//            for (k,v) in self.grouped {
//                print("grade: \(k)")
//                print("items per grade: \(v.count)")
//            }
    }
}

struct ContentView: View {

       @ObservedObject var students = GetStudents()

        var body: some View {
        let keys = students.grouped.map{$0.key}
        let values = students.grouped.map {$0.value}

        return VStack {
            Text("Total Students: \(self.getTotal())")

//            Text("Total Per Grade Level")

            List {
                ForEach(keys.indices) {index in
                    HStack {
                        Text(String("Students in Grade \(keys[index])"))
                        Spacer()
                        Text("Total: \(values[index].count)")
                    }
                }
                ForEach(students.items) { student in
                    HStack {
                       Text("Name: \(student.name)")
                       Spacer()
                       Text("Grade: \(student.gradeLevel)")
                   }
               }
           }.listStyle(GroupedListStyle())
        }
    }

    private func getTotal() -> Int {
        return self.students.items.count
    }
}
...