У меня есть массив, определенный как:
var MyArrayOfPaintings = [Painting]()
где Живопись определяется как:
struct Painting{
let Artist: String
let Name: String
let ThumbNailURL: String
var PaintsUsed: [Paint]
}
и Paint определяется как:
struct Paint{
var PaintType: String
var PaintColorName: String
}
Обычно, если я хочу отфильтровать этот массив на основе свойства Name в строке поиска, я просто добавляю строку как таковую:
FilteredArray = MyArrayOfPaintings.filter({$0.Name.lowercased().contains(searchText.lowercased())})
Это прекрасно работает, но теперь внутри моей панели поиска я также хотел бы иметь возможность искать, а затем фильтровать MyArray, где PaintColorName — это искомое значение.
Как я могу фильтровать MyArrayOfPaintings на основе предоставленного PaintColourName, как вы по существу фильтруете массив на основе массива структур внутри него?
Также, пожалуйста, начинайте имена свойств и имена переменных с минускула. Заглавные буквы для типов.
Не имеет отношения к вашему вопросу, но вы можете использовать localizedCaseInsensitiveContains вместо нижнего регистра имени и текста поиска. Что касается вашего вопроса, вы можете отфильтровать краски, которые содержат название цвета.
struct Painting {
let artist: String
let name: String
let thumbNailURL: String
var paints: [Paint]
}
struct Paint {
var type: String
var colorName: String
}
var paintings: [Painting] = [.init(artist: "Artist A", name: "Name A", thumbNailURL: "url1", paints: [.init(type: "a", colorName: "white"), .init(type: "b", colorName: "black")]),
.init(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [.init(type: "c", colorName: "red"), .init(type: "d", colorName: "green")])]
let searchText = "green"
let filtered = paintings.filter { $0.paints.contains {$0.colorName.localizedCaseInsensitiveContains(searchText) } }
print(filtered) // [Painting(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [Paint(type: "c", colorName: "red"), Paint(type: "d", colorName: "green")])]
Если вы хотите получить только краску, вы можете использовать flatMap вместо фильтра, а затем использовать фильтр вместо содержимого:
let paints = paintings.flatMap { $0.paints.filter {$0.colorName.localizedCaseInsensitiveContains(searchText) } }
paints // [{type "d", colorName "green"}]
Спасибо, это помогло, также не понял, что функция нечувствительности к регистру помогает сохранить еще одну строку преобразований. Спасибо
Таким же образом. Вам просто нужно спросить у каждой картины, имеет ли какая-либо из используемых красок этот цвет.