Swift:按字母顺序排列对象的数组

我有这个:

class Movies { Name:String Date:Int } 

和一组[电影]。 如何按名称按字母顺序排列数组? 我试过了:

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

movieArr = sorted(movieArr)

但这不起作用,因为我没有访问电影的名称属性。

在closures时,你要通过sort ,比较你想sorting的属性。 喜欢这个:

 movieArr.sort { $0.Name < $1.Name } 

旁注:通常只有types以大写字母开头; 我build议使用namedate ,而不是NameDate


例如,在操场上:

 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.sort { $0.name < $1.name } sortedMovies 

sortedMovies将按顺序[movieA, movieB, movieC]

使用Swift 3,您可以select以下方法之一来解决您的问题。


1.使用与不符合Comparable协议的Movie类一起使用sorted(by:​) Comparable

如果Movie类不符合Comparable协议,则必须在您的闭包中指定您希望使用Array的sorted(by:​)方法的属性。

Movie类声明:

 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 } } 

用法:

 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.使用符合Comparable协议的Movie类来sorted(by:​) Comparable

但是,通过使Movie类符合Comparable协议,当您想使用Array的sorted(by:​)方法时,可以有一个简洁的代码。

Movie类声明:

 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 } } 

用法:

 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.使用与符合Comparable协议的Movie类一起使用sorted()

通过使您的Movie类符合Comparable协议,您可以使用Array的sorted()方法作为sorted(by:​)的替代方法。

Movie类声明:

 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 } } 

用法:

 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] */ 

对于那些使用Swift 3的人来说,接受答案的等价方法是:

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

斯威夫特4

自从Swift 3以来,它们已经改变了很less的语法。下面是Swift 4的版本。

MovieArr.sort(by:{$ 0.name <$ 1.name})

编辑

新的语法

MovieArr.sorted(by: { $0.name < $1.name })