如何使用数组对 class 进行排序? - swift 5

How can I sort a class using an array? - swift 5

我有一个 class 叫 "cars":

car1 = [name: "ferrari", color: "black", size: "small" ]
car2 = [name: "Lamborghini", color: "orange", size: "small" ]
car3 = [name: "Audi", color: "black", size: "big" ]
car4 = [name: "fiat", color: "yellow", size: "small" ]
car5 = [name: "ferrari", color: "red", size: "medium" ]

并列出了它们:

list = [car1,car2,car3,car4]

现在我想sort/filter这个列表。

如果我尝试使用字符串过滤它,一切正常:

let searchtext = "Audi"
filteredlist = list.filter({ [=14=].name.lowercased().contains(searchText.lowercased()) })
      --> filteredlist = [car3]   //result 

但我想使用数组,这样我就可以显示更多结果。类似于按一种以上颜色过滤(类似于 "if statement" 中的 "or" 条件)。

我试过同样的结构(当然没用):

let searchtext = ["black","red"]
filteredlist = list.filter({ [=15=].color.contains(searchText) })
    --> filteredlist = [car1,car3,car5]  //expected, got compilation error instead

我遇到了这些错误:

Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String'  
Instance method 'contains' requires that '[String]' conform to 'StringProtocol'

我可以考虑 2 种解决方案(不是理想的解决方案)来解决此需求:

1 - 创建一个 while/for 函数并为 searchtext 数组的每个元素过滤列表,最后合并所有内容(不推荐,因为我将不得不阅读列表 'n' 次)

更新:愚蠢的方式

var i = 0
var listapp: [Item] = []
while i < searchtext.count {
    listapp.append(contentsOf: list.filter({ [=17=].tipo.contains(searchtext[i]) }))
    i += 1
}
list = listapp

2 - 使用 'if'、'or'、'while' 而非使用 list.filter 函数

手动过滤列表

反过来:

let searchtext = ["black","red"]
filteredlist = list.filter({ searchtext.contains([=10=].color) })

contains 应该做到:

let searchText = ["black", "red"].map { [=10=].lowercased() }
filteredlist = list.filter { item in
   let color = item.color.lowercased()
   return searchText.contains { text in color.contains(text) }
}