如何在Swift中使用可选的多个条件过滤数组? [英] How to filter an array in Swift with optional multiple criteria?

查看:323
本文介绍了如何在Swift中使用可选的多个条件过滤数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个条件可以用来过滤数组.这些条件是可选的,并存储在struct中,因为用户只能选择其中的一部分.我有一系列模型.我尝试使用过滤器方法,但是您必须为其提供非可选条件.应该采用哪种方法来摆脱可选参数,并将该标准添加到过滤方法中?

I have several criteria to filter array with. These criteria are optionals and stored in struct, because user can select only part of them. I have an array of models. I tried to use filter method, but you have to provide non optional criteria to it. What approach should be to get rid of optionals and add that criteria to filter method?

带有过滤选项的过滤结构

Filter struct with filtering options

struct Filter {
  var brand: String?
  var price: Int?
  var consuption: Int?
}

模型类

class CarOffer {
  var brand: String
  var price: Int
  var color: String
  var consumption: Int
}

这是我尝试做的,但是没有运气,因为filter.price是可选的,我不知道它是否会是.我知道我必须删除一个可选项,但是如何根据其可选性在过滤器方法中添加过滤条件?还是我选择了错误的方法?

And here what I tried to do, but no luck because filter.price is optional and I don't know will it be or not. I understand that I have to remove an optional, but how to add a filter criteria in filter method depending on it's optionality? Or I am have choosen wrong approach?

let offers: [CarOffer] = […]

func applyFilter(filter: Filter) -> [CarOffer] {

let filteredOffers = offers.filter { $0.brand == filter.brand && $0.price <= filter.price && $0.consumption <= filter.consumption }

return filteredOffers
}

推荐答案

通过将代码简化和分解成较小的部分,您会更轻松.没有理由为什么在某些条件下过滤数组的函数也必须负责确定元素是否满足这些条件.您在头脑中陷入了陷阱,以为筛选器谓词是封闭中&&条件的一长链.

You would have an easier time by simplifying and breaking up your code into smaller pieces. There's no reason why a function to filter an array by some conditions, also has to be responsible for figuring out if an element meets those conditions. You've mentally trapped yourself thinking that the filter predicate has be one one long chain of && conditions in a closure.

struct CarOffer {
    let brand: String
    let price: Int
    let color: String
    let consumption: Int
}

struct CarFilter {
    let brand: String?
    let price: Int?
    let consumption: Int?

    func matches(car: CarOffer) -> Bool {
        if let brand = self.brand, brand != car.brand { return false }
        if let price = self.price, price != car.price { return false }
        if let consumption = self.consumption, consumption != car.consumption { return false }
        return true
    }
}

extension Sequence where Element == CarOffer {
    func filter(carFilter: CarFilter) -> [CarOffer] {
        return self.filter(carFilter.matches)
    }
}

let filter = CarFilter(brand: nil, price: nil, consumption: nil)
let offers: [CarOffer] = [] //...
let filteredOffers = offers.filter(carFilter: filter)

这篇关于如何在Swift中使用可选的多个条件过滤数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆