У меня есть класс с именем "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]
, и теперь я хочу отсортировать / отфильтровать этот список.
Если я попытаюсь отфильтровать его, используя строку, все будет работать нормально:
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 раз)
update: тупой путь
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', 'или', 'while' вместо использования функции list.filter