Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dsmatter/SwiftSortUtils

Useful functions and extensions for sorting in Swift
https://github.com/dsmatter/SwiftSortUtils

Last synced: 5 days ago
JSON representation

Useful functions and extensions for sorting in Swift

Awesome Lists containing this project

README

        

# SwiftSortUtils

[![CI Status](https://img.shields.io/travis/dsmatter/SwiftSortUtils.svg?style=flat)](https://travis-ci.org/dsmatter/SwiftSortUtils.svg?branch=master)
[![Version](https://img.shields.io/cocoapods/v/SwiftSortUtils.svg?style=flat)](http://cocoapods.org/pods/SwiftSortUtils)
[![License](https://img.shields.io/cocoapods/l/SwiftSortUtils.svg?style=flat)](http://cocoapods.org/pods/SwiftSortUtils)
[![Platform](https://img.shields.io/cocoapods/p/SwiftSortUtils.svg?style=flat)](http://cocoapods.org/pods/SwiftSortUtils)

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

```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.

## 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](http://cocoapods.org). To install
it, simply add the following line to your Podfile:

```ruby
pod "SwiftSortUtils"
```

### Manually

Download the files in [`Pod/Classes`](https://github.com/dsmatter/SwiftSortUtils/tree/master/Pod/Classes) and drop them into your project.

## Author

Daniel Strittmatter, [email protected]

## License

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