This PR For Swift Foundation adds compound functionality to Predicates like so: If you are targeting only those versions and above you should use this instead:
let notTooShort = #Predicate<Book> { $0.pages > 50 }
let notTooLong = #Predicate<Book> { $0.pages <= 350 }
let titleFilter = #Predicate<Book> { $0.title.contains("Swift") }
let filter = #Predicate<Book> {
(notTooShort.evaluate($0) && notTooLong.evaluate($0)) || titleFilter.evaluate($0)
}CompoundPredicate aims to improve the Predicate system to enable combining multiple predicates after constructing them:
let notTooShort = #Predicate<Book> {
$0.pages > 50
}
let notTooLong = #Predicate<Book> {
$0.pages <= 350
}
let lengthFilter = [notTooShort, notTooShort].conjunction()
// Match Books that are just the right length
let titleFilter = #Predicate<Book> {
$0.title.contains("Swift")
}
// Match Books that contain "Swift" in the title or
// are just the right length
let filter = [lengthFilter, titleFilter].disjunction()The documentation is available here and as Docc archive you can view using Xcode
Please feel free to create an Issue, or even better contribute actively by creating a pull request
-
Arithmetic (+, -, *, /, %)
-
+,-,*PredicateExpressions.Arithmetic -
/PredicateExpressions.FloatDivision -
/PredicateExpressions.IntDivision -
%PredicateExpressions.IntRemainder
-
-
Unary minus
-PredicateExpressions.UnaryMinus -
Range (..., ..<)
-
...PredicateExpressions.ClosedRange -
..<PredicateExpressions.Range -
x..<z).contains(y)PredicateExpressions.RangeExpressionContains
-
-
Comparison (<, <=, >, >=, ==, !=)
-
<,<=,>,>=PredicateExpressions.Comparison -
==PredicateExpressions.Equal -
!=PredicateExpressions.NotEqual
-
-
Conditionals & Ternary (?:)
PredicateExpressions.Conditional -
Boolean logic (&&, ||, !)
-
&&PredicateExpressions.Conjunction -
||PredicateExpressions.Disjunction -
!PredicateExpressions.Negation
-
-
Swift optionals (?, ??, !, flatMap(_:), if-let expressions)
-
?,flatMap(_:)PredicateExpressions.OptionalFlatMap -
??,if-letPredicateExpressions.NilCoalesce
-
-
Types (as, as?, as!, is)
-
as?PredicateExpressions.ConditionalCast -
as,as!PredicateExpressions.ForceCast
-
-
Sequence operations (allSatisfy(), filter(), contains(), contains(where:), starts(with:), max(), min())
-
allSatisfy()PredicateExpressions.SequenceAllSatisfy -
filter()PredicateExpressions.Filter[completion:: 2024-03-10] -
contains()PredicateExpressions.SequenceContains[completion:: 2024-03-10] -
contains(where:)PredicateExpressions.SequenceContainsWhere -
starts(with:)PredicateExpressions.SequenceStartsWith -
min()PredicateExpressions.SequenceMinimum[completion:: 2024-03-10] -
max()PredicateExpressions.SequenceMaximum
-
-
Subscript and member access ([], .)
-
[0,1][0]PredicateExpressions.CollectionIndexSubscript -
["a": "b"]["a"]PredicateExpressions.DictionaryKeySubscript -
["a": "b"]["a", defaultValue: "b"]PredicateExpressions.DictionaryKeyDefaultValueSubscript -
obj.someKeyPredicateExpressions.KeyPath
-
-
String comparisons
-
contains(_:)PredicateExpressions.CollectionContainsCollection -
localizedStandardContains(_:)PredicateExpressions.StringLocalizedStandardContains -
caseInsensitiveCompare(_:)PredicateExpressions.StringCaseInsensitiveCompare -
localizedCompare(_:)PredicateExpressions.StringLocalizedCompare
-