This library takes a shot at making comparing and sorting in Swift more pleasant. It also allows you to reuse your old NSSortDescriptor
instances in Swift.
let somePeople: [Person] = ...
// Sort by a single comparable attribute
let ... = somePeople.sort(by: compareBy(\.firstname))
let ... = somePeople.sort(by: compareBy { $0.firstname })
let ... = somePeople.sort(by: compareBy(.descending, \.firstname))
let ... = somePeople.sort(byComparing: \.firstname)
let ... = somePeople.sort(byComparing: \.firstname, ordering: .descending)
// Sort by multiple attributes
let ... = somePeople.sort(by:
compareBy { $0.age } <|>
compareBy { $0.lastname } <|>
compareBy(\.firstname)
)
// With less cumbersome syntax:
let ... = somePeople.sort(by: \.age <|> \.firstname <|> \.lastname)
let ... = somePeople.sort(byComparing: [\.firstname, \.lastname]) // monomorphic
// Append any comparator function
let ... = somePeople.sort(by:
compareBy { $0.age } <|>
{ (p1, p2) in p1.wearsGlasses() && !p2.wearsGlasses() }
)
// Reverse compare functions
let ... = somePeople.sort(by:
compareBy(.descending) { $0.age } <|>
compareBy { $0.lastname } <|>
reverseComparator(compareBy(\.firstname)) // reverse any compare function
)
// Mix and match extractor and compare functions:
let ... = somePeople.sort(by:
compareBy(.descending, \.age) <|>
\.firstname <|>
\.lastname <|>
reverseComparator(myCompareFunction)
)
// Use an NSSortDescriptor
let ageSortDescriptor = NSSortDescriptor(key: "age", ascending: true)
let ... = somePeople.sort(ageSortDescriptor.toCompareFunction())
// Even Use multiple NSSortDescriptors
let nameSortDescriptors = [
NSSortDescriptor(key: "lastname", ascending: true),
NSSortDescriptor(key: "firstname", ascending: true)
]
let ... = somePeople.sort(by: nameSortDescriptors.toCompareFunction())
See the tests for more examples.
To run the example project, clone the repo, and run pod install
from the Example directory first.
This Version of SwiftSortUtils is meant to be used with Swift 5.
SwiftSortUtils is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "SwiftSortUtils"
Download the files in Pod/Classes
and drop them into your project.
Daniel Strittmatter, daniel@smattr.de
SwiftSortUtils is available under the MIT license. See the LICENSE file for more info.