SwiftyFilters

main

SwiftyFilters is a lightweight, Swift-based framework that lets you effortlessly build high-performance, declarative filter systems with a SwiftUI-inspired DSL.
maydibee/SwiftyFilters

SwiftyFilters Banner

CI Swift Version SwiftUI seamless compatibility License SPM Supported Platform iOS 15+

Build High-Performance Filter Trees Declaratively

---

Never has creating complex filters in iOS apps been so effortless. Magic is here ✨

SwiftyFilters is a lightweight, pure-Swift framework that lets you create complex filter systems using a DSL-like syntaxβ€Š-β€Šthink SwiftUI, but for filtering.

The secret? A SwiftUI-inspired syntax that transforms tedious filtering logic into clean, expressive code. Whether you're filtering aircraft by type, products by price, or events by date, SwiftyFilters lets you focus on what you want to achieve, while it handles the how.

Built with performance in mind, SwiftyFilters uses lazy-loading at every level to ensure your app stays fast and responsive. It only loads data and allocates resources when they’re actually needed.

πŸš€ Features

  • Declarative API: Define filters using a SwiftUI-like syntax.
  • Nested Filters: Create complex filter hierarchies with ease.
  • Lazy Loading: Resources are loaded only when needed.
  • SwiftUI Integration: Designed to work seamlessly with SwiftUI.
  • Customizable: Use default UI components or build your own.

πŸ“¦ Installation

Swift Package Manager

  1. In Xcode, open your project and navigate to File β†’ Add Packages....
  2. Paste the repository URL: https://github.com/maydibee/SwiftyFilters.git
  3. Select the version you want to use (or leave as "Up to Next Major").
  4. Click Add Package.

Manual Setup

Add SwiftyFilters as a dependency in your Package.swift:

dependencies: [
 .package(url: "https://github.com/maydibee/SwiftyFilters.git", from: "1.0.0")
]

Quick start

The basic usage of SwiftyFilters, when custom UI elements for filters are not required, consists of four steps.

1. Define the root filter and implement filter components in the body

struct AircraftFilter: SFFilter {
    
    let worker: AircraftListWorker
    
    var body: [SFFilterComponent<Aircraft>] {
        
        SFMultiSelectionFilter(title: "Type")
            .fetchItems { await worker.fetchAllTypes() }
            .filter(by: \.type)
        
        SFMultiSelectionFilter(title: "Last exploiter")
            .fetchItems { await self.worker.fetchAllExploiters() }
            .filter(byOptional: \.lastExploater)
            .includeNone(withTitle: "New aircraft")

        SFKeywordsFilter(title: "Remarks")
            .filter(by: \.remarks)
            .includeNone(withTitle: "No remarks")
            
        SFRangeFilter(title: "First flight date")
            .filter(by: \.firstFlightDate)
            .displayIn { node in
                SFFilterDateRangeView(node: node)
            }    
    }
}

2. Initialize SFFiltersCore and pass the AircraftFilter instance to the content parameter

let filter = AircraftFilter(worker: worker)
let filtersCore = SFFiltersCore<Aircraft>(title: "Filters", content: filter)

3. Initialize SFFilterRootView with the created filtersCore and present it where needed

SFFilterRootView(filtersCore: filtersCore)

4. Apply filters on demand

func applyFilters() {
    self.filteredAircraft = filtersCore.getFilteredData(from: aircraft)
}

πŸ“ Documentation

Read the full documentation here:
πŸ‘‰ SwiftyFilters Documentation

πŸ‘‰ Usage

Description

  • Swift Tools 5.7.0
View More Packages from this Author

Dependencies

  • None
Last updated: Fri May 16 2025 13:35:31 GMT-0900 (Hawaii-Aleutian Daylight Time)