filter
方法是一个非常强大的工具,可以按单个或多个条件进行过滤,但有没有办法根据数组的条件进行过滤?
类Car
,其属性为:model
,color
,engineStatus
。
cars
是一个车辆很少的数组一个条件看起来像:
let currModel = `Opel`
let filterdObject = cars.filter { $0.model == currModel }
两个或两个以上的条件如下:
let currModel = `Opel`
let currColor = `Green`
let filterdObject = cars.filter { $0.model == currModel || $0.color == currColor }
我的问题是我怎样才能按照以下数组进行过滤:
数组具有例如两种颜色blue
和green
。我想按这些颜色过滤cars
。我的观点是得到n-conditions
的公式。
答案 0 :(得分:24)
暂时忘掉过滤器。想一想如何检查汽车的颜色是否为数组中的值。
let colors = [ "Green", "Blue" ]
// or let colors: Set = [ "Green", "Blue" ]
if colors.contains(someCar.color) {
}
足够简单。现在在过滤器中使用相同的简单表达式。
let filterdObject = cars.filter { $0.model == currModel || colors.contains($0.color) }
答案 1 :(得分:5)
将过滤器闭包视为值类型并将其存储在数组中。使用内部reduce调用创建一个布尔值,该值为true,即当前汽车满足所有条件。如果您需要复合测试,如color ==" blue"或"绿色"然后只需将其添加到过滤器闭包条件数组中。
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) }
}