Моя цель - иметь возможность фильтровать по имени в словаре, сгруппированном по ключу, и видеть результаты, отфильтрованные по тексту, введенному в поле поиска. Я остановился на:
var groupedContacts: [String: [CNContact]] {
.init (
grouping: store.contacts,
by: {$0.nameFirstLetter}
)
}
func filterContactsByName(_ textSearch: String) -> [String: [CNContact]] {
let contacts = groupedContacts
if !textSearch.isEmpty {
return contacts.compactMapValues{$0.filter {$0.name.localizedCaseInsensitiveContains(textSearch)}}.filter{!$0.value.isEmpty}
} else {
return contacts
}
}
А потом:
List() {
ForEach(self.filterContactsByName(searchText).keys.sorted(), id: \.self) { key in
Section(header: Text(key).modifier(SectionHeader(backgroundColor: Color.white, foregroundColor: Color.black))) {
ForEach(self.groupedContacts[key]!, id: \.self) { contact in
HStack {
self.image(for: contact.imageProfile)
.renderingMode(.original)
.resizable()
.scaledToFill()
.frame(width: 40, height: 40)
.aspectRatio(contentMode: .fit)
.clipShape(Circle())
Мой результат: снимок экрана
Как я понял, я получил все результаты в ключевой группе, поэтому мы видим Даниал перед Дэвидом. И это будет то же самое, если мы введем Дэвида - мы увидим Даниал. ТИА за помощь.