Di closure yang Anda teruskan sort
, bandingkan properti yang ingin Anda sortir. Seperti ini:
movieArr.sorted { $0.name < $1.name }
atau berikut ini jika Anda ingin mengabaikan kasus:
movieArr.sorted { $0.name.lowercased() < $1.name.lowercased() }
Catatan sisi: Biasanya hanya jenis yang dimulai dengan huruf besar; Saya akan merekomendasikan penggunaan name
dan date
, bukan Name
dan Date
.
Contoh, di taman bermain:
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
akan diurutkan [movieA, movieB, movieC]
Pembaruan Swift5
channelsArray = channelsArray.sorted { (channel1, channel2) -> Bool in
let channelName1 = channel1.name
let channelName2 = channel2.name
return (channelName1.localizedCaseInsensitiveCompare(channelName2) == .orderedAscending)
.lowercaseString
akan memecahkan masalah ini.sorted
di Swift 3 lagi: D.Dengan Swift 3, Anda dapat memilih salah satu cara berikut untuk menyelesaikan masalah Anda.
1. Menggunakan
sorted(by:)
denganMovie
kelas yang tidak sesuai denganComparable
protokolJika
Movie
kelas Anda tidak sesuai denganComparable
protokol, Anda harus menentukan dalam closure Anda properti yang ingin Anda gunakansorted(by:)
metode Array .Movie
deklarasi kelas: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 } }
Pemakaian:
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. Menggunakan
sorted(by:)
denganMovie
kelas yang sesuai denganComparable
protokolNamun, dengan membuat
Movie
kelas Anda sesuai denganComparable
protokol, Anda dapat memiliki kode yang lebih ringkas saat Anda ingin menggunakansorted(by:)
metode Array .Movie
deklarasi kelas: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 } }
Pemakaian:
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. Menggunakan
sorted()
denganMovie
kelas yang sesuai denganComparable
protokolDengan membuat
Movie
kelas Anda sesuai denganComparable
protokol, Anda dapat menggunakansorted()
metode Array sebagai alternatifsorted(by:)
.Movie
deklarasi kelas: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 } }
Pemakaian:
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] */
sumber
movies.sorted(by: <)
danmovies.sorted()
)?sorted(by:)
dansorted()
dua metode berbeda. Anda dapat menggunakanarray.sorted()
sebagai alternatifarray.sorted(by: <)
.sorted(by:)
dansorted()
?Comparable
protokol."1" "14""28""31""4""42""49"
let sortArray = array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
sumber
Bagi mereka yang menggunakan Swift 3, metode yang setara untuk jawaban yang diterima adalah:
movieArr.sorted { $0.Name < $1.Name }
sumber
Array yang diurutkan Swift 4.2
arrayOfRaces = arrayOfItems.sorted(by: { ($0["raceName"] as! String) < ($1["raceName"] as! String) })
sumber
*import Foundation import CoreData extension Messages { @nonobjc public class func fetchRequest() -> NSFetchRequest<Messages> { return NSFetchRequest<Messages>(entityName: "Messages") } @NSManaged public var text: String? @NSManaged public var date: Date? @NSManaged public var friends: Friends? } //here arrMessage is the array you can sort this array as under bellow var arrMessages = [Messages]() arrMessages.sort { (arrMessages1, arrMessages2) -> Bool in arrMessages1.date! > arrMessages2.date! }*
sumber
Sebagian besar jawaban ini salah karena kegagalan menggunakan perbandingan berbasis lokal untuk pengurutan. Lihat localizedStandardCompare ()
sumber