【发布时间】:2020-07-09 02:47:49
【问题描述】:
我有一门叫“汽车”的课:
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]
现在我想对这个列表进行排序/过滤。
如果我尝试使用字符串过滤它,一切正常:
let searchtext = "Audi"
filteredlist = list.filter({ $0.name.lowercased().contains(searchText.lowercased()) })
--> filteredlist = [car3] //result
但我想使用一个数组,所以我可以显示更多结果。类似于通过一种以上的颜色进行过滤(类似于“if 语句”中的“或”条件)。
我尝试过相同的结构(但当然没有用):
let searchtext = ["black","red"]
filteredlist = list.filter({ $0.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({ $0.tipo.contains(searchtext[i]) }))
i += 1
}
list = listapp
2 - 使用 'if','or','while' 手动过滤列表,而不是使用 list.filter 函数
【问题讨论】:
-
过滤
list.filter { ($0.color == "black" || $0.color == "red") && $0.name.lowercased() == "audi" }时可以使用AND和OR -
不知道有多少种可能性。这是一个用户输入
-
您可以在过滤器函数中编写任意数量的代码。开始和结束大括号不必在同一行。
标签: ios arrays swift filter tableview