根据过滤器阵列

时间:2015-12-30 11:33:49

标签: ios arrays swift

我遇到了一个问题,我自己找不到一个好的答案。

我有一个包含对象的数组,其中包含有关公司的信息。基于这些对象,我创建了一个集合视图,我从这些对象中的信息中填充项目。

var suppliers = [Suppliers]()

现在我想添加具有特定过滤器的按钮。按下这些按钮中的一个或多个按钮时,集合视图应在应用过滤器时更新。

因此我制作了几个按钮,按下后我将它们添加到包含所有过滤器的数组中。

var filters = [Category]()

之后我调用一个应该进行过滤并更新集合视图的方法。

private func filter()
{
    if filters.count > 0 {
        suppliers.filter({ ($0.category!).contains(filters)})
    }
}

不幸的是,根据xCode,我不能这样比较。如何正确实现此过滤?

编辑:查看下面对象的结构。

struct Supplier : JSONJoy {

    var about: String?
    var category: Array<Category>?
    var logo: String?
    var name: String?

    init(_ decoder: JSONDecoder) {
        name = decoder["name"].string
        logo = decoder["logo"].string
        about = decoder["about"].string
        if let ctgrys = decoder["category"].array {
            category = Array<Category>()
            for ctgryDecoder in ctgrys {
                category?.append(Category(ctgryDecoder))
            }
        }
}

struct Category : JSONJoy {
    var id: Int?
    var name: String?

    init(_ decoder: JSONDecoder) {
        id = decoder["id"].integer
        name = decoder["name"].string
    }

}

3 个答案:

答案 0 :(得分:1)

1)$0.category![Category]类型。并且您需要[Category].contains调用,这需要(Category) throws -> Bool参数,但在您的情况下,filters变量[Category]类型

2)您永远不会应用过滤结果

如果我正确理解您的需求,这可能是您的过滤实施:

private func filter() -> [Supplier] {
    if filters.count > 0 {
        return suppliers.filter { supplier in
            return supplier.category?.contains { supplierCategory in
                return filters.contains {
                    return supplierCategory.id == $0.id
                }
            } ?? false
        }
    } else {
        return suppliers
    }
}

答案 1 :(得分:1)

我们需要修复一些能让我们的生活更轻松的细节:)

1。类别变为Equatable and Hashable

struct Category: JSONJoy, Equatable, Hashable {
    var id: Int?
    var name: String?

    init(_ decoder: JSONDecoder) {
        id = decoder["id"].integer
        name = decoder["name"].string
    }
    var hashValue: Int { get { return id?.hashValue ?? 0 } }
}

func ==(left:Category, right:Category) -> Bool {
    return left.id == right.id && left.name == right.name
}

2。供应商不喜欢可选的类别属性

struct Supplier: JSONJoy {

    var about: String?
    var category = [Category]() // <- I changed this
    var logo: String?
    var name: String?

    init(_ decoder: JSONDecoder) {
        name = decoder["name"].string
        logo = decoder["logo"].string
        about = decoder["about"].string
        if let ctgrys = decoder["category"].array {
            category = Array<Category>()
            for ctgryDecoder in ctgrys {
                category.append(Category(ctgryDecoder))
            }
        }
    }
}

3。现在我们不要过滤所有

您有供应商列表和过滤器列表

var suppliers = [Supplier]()
var filters = [Category]()

现在我不确定您要如何过滤suppliers

然而 IF 您希望所有供应商<{1}}中列出至少一个过滤器

filters

另一方面 IF 您希望所有供应商都在let requiredFilters = Set(filters) let supplierWithAtLeastOneRequiredFilter = suppliers.filter { !Set($0.category).intersect(requiredFilters).isEmpty } 中列出所有过滤器

filters

答案 2 :(得分:0)

假设filteredarray的已过滤SupplierAllDataSupplier的完整数组。并且您只想过滤其"ao"属性中包含单词name的项目。

  filtered  = AllData.filter {
                $0.name.rangeOfString("ao", options: .CaseInsensitiveSearch) != nil
            }
        if(filtered.count == 0){
           //No Results - 
        } else {
              //There are results - update the tableView data source accordingly
        }