Как я могу отсортировать класс, используя массив? - быстро 5 - PullRequest
1 голос
/ 28 марта 2020

У меня есть класс с именем "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

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

наоборот:

let searchtext = ["black","red"]
filteredlist = list.filter({ searchtext.contains($0.color) })
0 голосов
/ 28 марта 2020

Двойной contains должен сделать это:

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