该filter方法是一个非常强大的工具,可以根据单个或多个条件进行过滤,但是有没有办法根据数组条件进行过滤?
类Car与属性:model,color,engineStatus.
cars 是一个几乎没有汽车的阵列一个条件看起来像:
let currModel = `Opel`
let filterdObject = cars.filter { $0.model == currModel }
Run Code Online (Sandbox Code Playgroud)
两个或多个条件看起来像:
let currModel = `Opel`
let currColor = `Green`
let filterdObject = cars.filter { $0.model == currModel || $0.color == currColor }
Run Code Online (Sandbox Code Playgroud)
我的问题是我怎么能用数组过滤:
阵列具有例如两种颜色blue和green.我想cars用这些颜色过滤.我的意思是得到一个公式n-conditions.
rma*_*ddy 28
暂时忘掉过滤器.想一想如何检查汽车的颜色是否是数组中的值.
let colors = [ "Green", "Blue" ]
// or let colors: Set = [ "Green", "Blue" ]
if colors.contains(someCar.color) {
}
Run Code Online (Sandbox Code Playgroud)
很简单.现在在过滤器中使用相同的简单表达式.
let filterdObject = cars.filter { $0.model == currModel || colors.contains($0.color) }
Run Code Online (Sandbox Code Playgroud)
将过滤器闭包视为值类型,并将它们存储在数组中。使用内部reduce调用创建一个布尔值,如果当前汽车满足所有条件,则该值为true。如果您需要像color ==“ blue”或“ green”这样的复合测试,只需将其添加到过滤器关闭条件数组中即可。
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) }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13603 次 |
| 最近记录: |