我遇到了一个问题,我自己找不到一个好的答案。
我有一个包含对象的数组,其中包含有关公司的信息。基于这些对象,我创建了一个集合视图,我从这些对象中的信息中填充项目。
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
}
}
答案 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)
我们需要修复一些能让我们的生活更轻松的细节:)
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
}
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))
}
}
}
}
您有供应商列表和过滤器列表
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)
假设filtered
是array
的已过滤Supplier
。 AllData
是Supplier
的完整数组。并且您只想过滤其"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
}