Swift: Trier un tableau d'objets par ordre alphabétique

J'ai ceci:

class Movies {
  Name:String
  Date:Int
}

Et un tableau de [films]. Comment puis-je trier le tableau par ordre alphabétique par nom? J'ai essayé:

movieArr = movieArr.sorted{ $0 < $1 }

Et

movieArr = sorted(movieArr)

Mais cela ne fonctionne pas parce que je n'accède pas à l'attribut name des films.

100
demandé sur Sahil Kapoor 2014-11-03 20:36:55

4 réponses

Dans la fermeture que vous passez à sort, comparez les propriétés que vous souhaitez trier. Comme ceci:

movieArr.sorted { $0.name < $1.name }

Sidenote: Généralement seulement les types de commencer avec une lettre majuscule; je vous recommande d'utiliser name et date, pas Name et Date.


Exemple, dans un terrain de jeu:

class Movie {
    let name: String
    var date: Int?

    init(_ name: String) {
        self.name = name
    }
}

var movieA = Movie("A")
var movieB = Movie("B")
var movieC = Movie("C")

let movies = [movieB, movieC, movieA]
let sortedMovies = movies.sorted { $0.name < $1.name }
sortedMovies

sortedMovies sera dans l'ordre [movieA, movieB, movieC]

198
répondu Mike S 2017-12-26 15:08:25

Avec Swift 3, vous pouvez choisir l'une des manières suivantes pour résoudre votre problème.


1. Utilisation sorted(by:​) avec une classe Movie qui n'est pas conforme au protocole Comparable

Si votre classe Movie n'est pas conforme au protocole Comparable, vous devez spécifier dans votre fermeture la propriété sur laquelle vous souhaitez utiliser la méthode sorted(by:​) de Array.

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

}

Utilisation:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0.name < $1.name })
// let sortedMovies = movies.sorted { $0.name < $1.name } // also works

print(sortedMovies)

/*
prints: [Avatar, Piranha II: The Spawning, Titanic]
*/

2. À l'aide de sorted(by:​) avec un Movie classe conforme au protocole Comparable

Cependant, en rendant votre classe Movie conforme au protocole Comparable, Vous pouvez avoir un code très concis lorsque vous souhaitez utiliser la méthode sorted(by:​) de Array.

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

    static func ==(lhs: Movie, rhs: Movie) -> Bool {
        return lhs.name == rhs.name
    }

    static func <(lhs: Movie, rhs: Movie) -> Bool {
        return lhs.name < rhs.name
    }

}

Utilisation:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0 < $1 })
// let sortedMovies = movies.sorted { $0 < $1 } // also works
// let sortedMovies = movies.sorted(by: <) // also works

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */

3. Utilisation sorted() avec une classe Movie conforme au protocole Comparable

En rendant votre classe Movie conforme au protocole Comparable, Vous pouvez utiliser la méthode sorted() de Array comme alternative à sorted(by:​).

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

    static func ==(lhs: Movie, rhs: Movie) -> Bool {
        return lhs.name == rhs.name
    }

    static func <(lhs: Movie, rhs: Movie) -> Bool {
        return lhs.name < rhs.name
    }

}

Utilisation:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted()

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */
38
répondu Imanou Petit 2017-12-15 11:18:35

Pour ceux qui utilisent Swift 3, la méthode équivalente pour la réponse acceptée est:

movieArr.sorted { $0.Name < $1.Name }
13
répondu Jacobo Koenig 2017-02-05 20:55:32
let sortArray =  array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
6
répondu m.alqadi 2018-03-28 21:00:00