Воспользуйтесь мощью SwiftUI и его совместимостью с UIKit

По мере того, как SwiftUI завершает год, есть много чего ожидать от WWDC 2020. Наличие готовой функциональности панели поиска должно быть в списке желаний каждого.
А пока мы можем использовать совместимость SwiftUI-UIKit для создания настраиваемой панели поиска.
В следующих разделах мы будем создавать приложение SwiftUI для поиска контактов.
План действий
- Используйте платформу контактов для получения телефонных контактов.
- Заполните их в списке SwiftUI.
- Используйте протокол
UIViewRepresentable, чтобы создатьUISearchBarоболочку для SwiftUI. - Отфильтруйте список контактов SwiftUI на основе найденного текста.
Приступайте к работе - добавьте описания конфиденциальности
Платформа "Контакты" позволяет читать информацию без каких-либо изменений. Чтобы получить доступ к этому в вашем приложении, нам сначала нужно установить описания использования конфиденциальности в файле info.plist. Просто добавьте ключ NSContactsUsageDescription со строковым значением, объясняющим необходимость разрешения.

Оберните UISearchBar с помощью UIViewRepresentable и координаторов
SwiftUI не имеет встроенных функций для панелей поиска. Итак, нам нужно согласовать нашу структуру с протоколом UIViewRepresentable и инициализировать в ней экземпляр UISearchBar UIKit, как показано ниже:
Функция makeCoordinator() позволяет нам создать класс Coordinator, который отвечает за передачу изменений из нашего представления UIKit в интерфейс SwiftUI. Давайте определим класс Coordinator, который также объявляет протокол UISearchBarDelegate:
Создайте класс ObservableObject для выборки контактов
ObservableObject протокол является частью платформы Combine и используется для объявления изменений в представлении SwiftUI через @Published оболочку свойств.
В следующем коде мы получаем контакты, убедившись, что разрешение предоставлено, а затем сохраняем их в массиве-оболочке свойств Published:
SwiftUI нужен способ уникальной идентификации каждого контакта. Для этого мы создали в конце расширение, соответствующее протоколу Identifiable.
Теперь мы готовы интегрировать оболочку панели поиска и экземпляр класса ObservableObject в наш SwiftUI View. Давай сделаем это.
Создайте представление SwiftUI
Мы будем использовать @EnvironmentObject для получения контактов. Оболочка свойств позволяет получать доступ к общим данным в приложении.
В следующем коде с помощью списка SwiftUI мы можем заполнить контакты и обновить их с помощью filter на основе изменения searchText значения.
Вот посмотрите на приложение в действии, когда мы запустили его на симуляторе с фиктивными контактами:

Заключение
Нам удалось довольно быстро настроить приложение контактов SwiftUI с функциями поиска - несмотря на отсутствие поддержки встроенной панели поиска в SwiftUI.
То же самое с UITableView и UISearchBar потребует значительного количества времени, усилий и кода. Мы надеемся увидеть SwiftUI 2.0 в WWDC 2020 с новыми функциями.
Вы можете скачать полный исходный код из Репозитория Github.
Вот и все. Спасибо за прочтение.