user9914227
user9914227

Reputation:

Swift: Sort list object by property

after a lot of research on the net, I tried several solutions but it does not work? I want to sort my array according to the leaguecode property here is my code:

var teams = [Team]()

    dbReference.child(FBDatabaseKeys.teams).observeSingleEvent(of: .value) { (snapshot) in
        for nameTeam in snapshot.children.allObjects as! [DataSnapshot] {
            let value = nameTeam.value as? NSDictionary

            let team = Team(
                capitanId: value?[FBDatabaseKeys.Teams.captainID] as! String,
                leagueCode: value?[FBDatabaseKeys.Teams.leagueCode] as? String ?? value?["leageCode"] as! String,
                playersIds: [""], //todo retrieve data to array
                teamName: value?[FBDatabaseKeys.Teams.teamName] as! String,
                imageUrl: value?[FBDatabaseKeys.Teams.imageUrl] as! String,
                groupMoto: value?[FBDatabaseKeys.Teams.teamMoto] as! String,
                totalScore: String(format: "%@", value?[FBDatabaseKeys.Teams.totalScore] as? CVarArg ?? "") ,
                totalTickets: String(format: "%@", value?[FBDatabaseKeys.Teams.totalTickets] as? CVarArg ?? "")
            )

            if team.leagueCode == self.currentPlayer.leagueCode{
                teams.append(team)
            }
        }

        teams = teams.sort {
            Int($0.leagueCode)! < Int($1.leagueCode)!
        } as! [Team]

        //Sort array by property score
        completion(teams)
    }

Error:

Error:(204, 27) cannot assign value of type '()' to type '[Team]'

Here is my object:

struct Team {
let capitanId: String
let leagueCode: String
let playersIds: [String]
let teamName: String
let imageUrl: String
let groupMoto: String
let totalScore: String
let totalTickets: String

Thanks for your help

Upvotes: 1

Views: 3606

Answers (2)

Shehata Gamal
Shehata Gamal

Reputation: 100503

You need

teams  = teams.sorted {
  Int($0.leagueCode)! < Int($1.leagueCode)!
}

Or only mutating

teams.sort {
    Int($0.leagueCode)! < Int($1.leagueCode)!
}

https://developer.apple.com/documentation/swift/array/2296815-sorted https://developer.apple.com/documentation/swift/array/2296801-sort

//

dbReference.child(FBDatabaseKeys.teams).observeSingleEvent(of: .value) { (snapshot) in
        for nameTeam in snapshot.children.allObjects as! [DataSnapshot] {
            let value = nameTeam.value as? NSDictionary

            let team = Team(
                capitanId: value?[FBDatabaseKeys.Teams.captainID] as! String,
                leagueCode: value?[FBDatabaseKeys.Teams.leagueCode] as? String ?? value?["leageCode"] as! String,
                playersIds: [""], //todo retrieve data to array
                teamName: value?[FBDatabaseKeys.Teams.teamName] as! String,
                imageUrl: value?[FBDatabaseKeys.Teams.imageUrl] as! String,
                groupMoto: value?[FBDatabaseKeys.Teams.teamMoto] as! String,
                totalScore: String(format: "%@", value?[FBDatabaseKeys.Teams.totalScore] as? CVarArg ?? "") ,
                totalTickets: String(format: "%@", value?[FBDatabaseKeys.Teams.totalTickets] as? CVarArg ?? "")
            )

            if team.leagueCode == self.currentPlayer.leagueCode{
                teams.append(team)
            }
        }

        teams.sort {
            Int($0.leagueCode)! < Int($1.leagueCode)!
        }  


        completion(teams)
}

Upvotes: 1

vadian
vadian

Reputation: 285082

The error message

cannot assign value of type '()'

clearly says that the sort function doesn't return anything. The array is sorted in place.

And the conversions to Int are not necessary. You can sort strings numerically with localizedStandardCompare

teams.sort {
    $0.leagueCode.localizedStandardCompare($1.leagueCode) == .orderedAscending
}

Upvotes: 1

Related Questions