A type-safe Core Data query API using Swift 4's Smart KeyPaths
Swift Ruby Objective-C
Switch branches/tags
Nothing to show
Latest commit b0bb65f Sep 23, 2017 @kishikawakatsumi kishikawakatsumi Fix link URL
Permalink
Failed to load latest commit information.
Configurations Use Travis CI Sep 22, 2017
Kuery.xcodeproj Use Travis CI Sep 22, 2017
Scripts Use Travis CI Sep 22, 2017
Sources/Kuery Bump version to 0.3.0 Sep 22, 2017
Tests/KueryTests Use Travis CI Sep 22, 2017
.gitignore Initial commit Jun 14, 2017
.swift-version Initial commit Jun 14, 2017
.travis.yml Fix CI Sep 22, 2017
Kuery.podspec Bump version to 0.3.0 Sep 22, 2017
LICENSE Initial commit Jun 14, 2017
Package.swift Initial commit Jun 14, 2017
README.md Fix link URL Sep 23, 2017

README.md

Kuery

Build Status Codecov Pods Version Platforms Carthage Compatible

Kuery, a type-safe Core Data query API using Swift 4's Smart KeyPaths. Inspired and borrowed a lot of things from QueryKit and RealmEx.

Requirements

Kuery is written in Swift 4.

Installation

CocoaPods

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

pod 'Kuery'

Carthage

For Carthage, add the following to your Cartfile:

github "kishikawakatsumi/Kuery"

Description

Kuery provides type safety, code completion and avoidance of typos against NSPredicate queries.

Before

NSPredicate(format: "name == %@", "Katsumi")
NSPredicate(format: "age > %@", 20)

After

Query(Person.self).filter(\Person.name == "Katsumi")
Query(Person.self).filter(\Person.age > 20)

The following code should be a compile error.

Query(Person.self).filter(\Person.name > 20) // Compile error
Query(Person.self).filter(\Dog.name == "John") // Compile error

Usage

context.perform {
    let results = try Query(Person.self)
        .filter(\Person.name == "Katsumi")
        .execute()
}
context.perform {
    let results = try Query(Person.self)
        .filter(\Person.age == 36)
        .execute()
}
context.perform {
    let results = try Query(Person.self)
        .filter(\Person.age > 20)
        .execute()
}
context.perform {
    let results = try Query(Person.self)
        .filter(\Person.name == "Katsumi")
        .filter(\Person.age == 36)
        .execute()
}
context.perform {
    let results = try Query(Dog.self)
        .filter(\Dog.owner == person)
        .execute()
}

Feature request for Swift Standard Library

It requires a string representation of KeyPath to construct NSPredicate from KeyPath. However, the API is not officially visible currently. The feature request is tracked at SR-5220.

[SR-5220] Expose API to retrieve string representation of KeyPath - Swift