Skip to content

dsmatter/SwiftSortUtils

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
Pod
 
 
 
 
 
 
 
 
 
 

SwiftSortUtils

CI Status Version License Platform

Motivation

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.

Examples

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.

Usage

To run the example project, clone the repo, and run pod install from the Example directory first.

Installation

Swift Version

This Version of SwiftSortUtils is meant to be used with Swift 5.

CocoaPods

SwiftSortUtils is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "SwiftSortUtils"

Manually

Download the files in Pod/Classes and drop them into your project.

Author

Daniel Strittmatter, daniel@smattr.de

License

SwiftSortUtils is available under the MIT license. See the LICENSE file for more info.

About

Useful functions and extensions for sorting in Swift

Resources

License

Stars

Watchers

Forks

Packages

No packages published