Filter by multiple array conditions
Forget about the filter for a moment. Think how you would check if a car's color is a value in an array.
let colors = [ "Green", "Blue" ]
// or let colors: Set = [ "Green", "Blue" ]
if colors.contains(someCar.color) {
}
Simple enough. Now use that same simple expression in the filter.
let filterdObject = cars.filter { $0.model == currModel || colors.contains($0.color) }
Treat the filter closures like a value type and store them in an array. Use the inner reduce call to create a single boolean value that is true is all of the conditions are met by the current car. If you need a compound test like color == "blue" or "green" then simply add that to your filter closure conditions array.
struct Car {
let model: String
let color: String
}
let conditions: [(Car) -> Bool] = [
{$0.model == "Opel"},
{$0.color == "Red"},
]
let carLot = [
Car(model: "Opel", color: "Green"),
Car(model: "Mustang", color: "Gold"),
Car(model: "Opel", color: "Red"),
]
let allRedOpels = carLot.filter {
car in
conditions.reduce(true) { $0 && $1(car) }
}