EN VI

Sorting - Classification through Grid layout?

2024-03-17 00:30:05
How to Sorting - Classification through Grid layout

I have the following swift file which is initializing an array with a set of teams results. I'd like to show it in a separate view having it ordered by "punteggio" filed and organized according to the position achieved (e.g. promotion, playoff, playout, relegation).

Here below the code of the data struct:

import Foundation

struct Squadre: Identifiable, Hashable, Equatable {
    let id = UUID()
    let stagione: String
    let squadra: String
    let vinte: Int
    let pareggiate: Int
    let perse: Int
    let golfatti: Int
    let golsubiti: Int
    let diffreti: Int
    let punti: Int
    let punteggio: Double
    
    init(stagione: String, squadra: String, vinte: Int, pareggiate: Int, perse: Int, golfatti: Int, golsubiti: Int, diffreti: Int, punti: Int, punteggio: Double) {
        self.stagione = stagione
        self.squadra = squadra
        self.vinte = vinte
        self.pareggiate = pareggiate
        self.perse = perse
        self.golfatti = golfatti
        self.golsubiti = golsubiti
        self.diffreti = golfatti - golsubiti
        self.punti = (vinte * 3) + (pareggiate)
        self.punteggio = Double(punti + (golfatti / 100) + (diffreti / 1000))
    }
    
    
    static func test() -> [Squadre] {
        [ Squadre(stagione: "2023/2024", squadra: "Caste", vinte: 10, pareggiate: 7, perse: 4, golfatti: 34, golsubiti: 27, diffreti: 7, punti: 37, punteggio: 37.347),
          Squadre(stagione: "2023/2024", squadra: "Sole", vinte: 10, pareggiate: 7, perse: 4, golfatti: 34, golsubiti: 28, diffreti: 6, punti: 37, punteggio: 37.346),
          Squadre(stagione: "2023/2024", squadra: "Spina", vinte: 11, pareggiate: 6, perse: 4, golfatti: 34, golsubiti: 27, diffreti: 7, punti: 39, punteggio: 39.347),
          Squadre(stagione: "2023/2024", squadra: "Vigu", vinte: 9, pareggiate: 6, perse: 6, golfatti: 14, golsubiti: 22, diffreti: -5, punti: 33, punteggio: 33.347),
          Squadre(stagione: "2023/2024", squadra: "Nizza", vinte: 9, pareggiate: 6, perse: 6, golfatti: 13, golsubiti: 22, diffreti: -9, punti: 33, punteggio: 33.344),
          Squadre(stagione: "2023/2024", squadra: "Vigno", vinte: 8, pareggiate: 7, perse: 6, golfatti: 14, golsubiti: 14, diffreti: 0, punti: 25, punteggio: 25.347),
          Squadre(stagione: "2023/2024", squadra: "Audace", vinte: 8, pareggiate: 7, perse: 6, golfatti: 14, golsubiti: 22, diffreti: -8, punti: 25, punteggio: 25.247),
          Squadre(stagione: "2023/2024", squadra: "Casalo", vinte: 11, pareggiate: 6, perse: 4, golfatti: 37, golsubiti: 22, diffreti: 12, punti: 39, punteggio: 39.347),
          Squadre(stagione: "2023/2024", squadra: "Liba", vinte: 1, pareggiate: 6, perse: 14, golfatti: 4, golsubiti: 32, diffreti: -28, punti: 9, punteggio: 9.347),
          Squadre(stagione: "2023/2024", squadra: "Quar", vinte: 7, pareggiate: 5, perse: 9, golfatti: 14, golsubiti: 14, diffreti: 0, punti: 26, punteggio: 26.347)]
    }
    

    
}

This is the code of the view. Everything is working fine except for the list of squadre which has not the values properly displayed.

In fact in displaying the classification "Vigno" and "Audace" are displayed with 31 "punti", while they should have 25.

import SwiftUI

struct ClassificaView: View {
    
    @State var squadre: [Squadre] = Squadre.test()

    var body: some View {
        
        let ClassificaSquadre = squadre.sorted {$0.punteggio > $1.punteggio}
        let numeroSquadre: Int = ClassificaSquadre.count
        let promozioneSquadre: Int = 1
        let playoffSquadre: Int = 4
        let playoutSquadre: Int = 2
        let retrocessioneSquadre: Int = 1
        
        ScrollView(.horizontal){
            List{
                Grid {
                    GridRow{
                        Text("Squadra")
                            .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                        Text("Punti")
                        Text("Vinte")
                        Text("Pareggiate")
                        Text("Perse")
                        Text("Gol fatti")
                        Text("Gol subiti")
                        Text("Differenza reti")
                    }
                    .bold()
                    Divider()
                    //Prima posizione
                    ForEach(
                        ClassificaSquadre
                            .enumerated()
                            .filter{
                                (0...promozioneSquadre - 1).contains($0.offset)
                            }
                            .map{$1}) { squadra in
                        GridRow{
                            Text(squadra.squadra)
                                .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                            Text(squadra.punti, format: .number)
                            Text(squadra.vinte, format: .number)
                            Text(squadra.pareggiate, format: .number)
                            Text(squadra.perse, format: .number)
                            Text(squadra.golfatti, format: .number)
                            Text(squadra.golsubiti, format: .number)
                            Text(squadra.diffreti, format: .number)
                        }
                    }
                    Divider()
                            .overlay(Color.green)
                    //Playoff
                    ForEach(
                        ClassificaSquadre
                            .enumerated()
                            .filter{
                                (promozioneSquadre...playoffSquadre).contains($0.offset)
                            }
                            .map{$1}) { squadra in
                                GridRow{
                                    Text(squadra.squadra)
                                        .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                                    Text(squadra.punti, format: .number)
                                    Text(squadra.vinte, format: .number)
                                    Text(squadra.pareggiate, format: .number)
                                    Text(squadra.perse, format: .number)
                                    Text(squadra.golfatti, format: .number)
                                    Text(squadra.golsubiti, format: .number)
                                    Text(squadra.diffreti, format: .number)
                                }
                                if squadra != ClassificaSquadre.last {
                                    Divider()
                                        .overlay(Color.orange)
                                }
                            }
                    //Permanenza in categoria
                    ForEach(
                        ClassificaSquadre
                            .enumerated()
                            .filter{
                                (playoffSquadre + 1...numeroSquadre - playoutSquadre - retrocessioneSquadre - 1).contains($0.offset)
                            }
                            .map{$1}) { squadra in
                                GridRow{
                                    Text(squadra.squadra)
                                        .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                                    Text(squadra.punti, format: .number)
                                    Text(squadra.vinte, format: .number)
                                    Text(squadra.pareggiate, format: .number)
                                    Text(squadra.perse, format: .number)
                                    Text(squadra.golfatti, format: .number)
                                    Text(squadra.golsubiti, format: .number)
                                    Text(squadra.diffreti, format: .number)
                                }
                                if squadra != ClassificaSquadre.last {
                                    Divider()
                                }
                            }
                    //Playout
                    ForEach(
                        ClassificaSquadre
                            .enumerated()
                            .filter{
                                (numeroSquadre - retrocessioneSquadre - playoutSquadre...numeroSquadre - retrocessioneSquadre - 1).contains($0.offset)
                            }
                            .map{$1}) { squadra in
                                GridRow{
                                    Text(squadra.squadra)
                                        .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                                    Text(squadra.punti, format: .number)
                                    Text(squadra.vinte, format: .number)
                                    Text(squadra.pareggiate, format: .number)
                                    Text(squadra.perse, format: .number)
                                    Text(squadra.golfatti, format: .number)
                                    Text(squadra.golsubiti, format: .number)
                                    Text(squadra.diffreti, format: .number)
                                }
                                if squadra != ClassificaSquadre.last {
                                    Divider()
                                        .overlay(Color.yellow)
                                }
                            }
                    //Retrocessione
                    ForEach(
                        ClassificaSquadre
                            .enumerated()
                            .filter{
                                (numeroSquadre - retrocessioneSquadre...numeroSquadre - 1 ).contains($0.offset)
                            }
                            .map{$1}) { squadra in
                                GridRow{
                                    Text(squadra.squadra)
                                        .gridCellAnchor(UnitPoint(x: 0, y: 0.5))
                                    Text(squadra.punti, format: .number)
                                    Text(squadra.vinte, format: .number)
                                    Text(squadra.pareggiate, format: .number)
                                    Text(squadra.perse, format: .number)
                                    Text(squadra.golfatti, format: .number)
                                    Text(squadra.golsubiti, format: .number)
                                    Text(squadra.diffreti, format: .number)
                                }
                                if squadra != ClassificaSquadre.last {
                                    Divider()
                                        .overlay(Color.red)
                                }
                            }
                }
            }
            .listStyle(.inset)
            .scrollContentBackground(.hidden)
            .frame(width: 900, height: 300)
            .navigationTitle("Classifica")
        }
    }
    }

Could you please let me know what I'm doing wrong? I'm getting crazy since two days.

Thanks, A.

Solution:

No, it's correct. Although you passed the punti parameter on the init function, you didn't use this field directly. You recalculated it with vinte and pareggiate fields. Try to drag a debug point on self.punti = (vinte * 3) + (pareggiate) line. It showed the same value as displayed on GridRow:

//Mock models
Squadre(squadra: "Vigno", punti: 25...),
Squadre(squadra: "Audace", punti: 25...),

enter image description here

Audace also got the same result. It seems like you accidentally received another element that is equal to punti field. You should check the formula.

Answer

Login


Forgot Your Password?

Create Account


Lost your password? Please enter your email address. You will receive a link to create a new password.

Reset Password

Back to login