Я делаю небольшое бесплатное iOS-приложение с планировками баз для Clash of Clans, и одна из первых задач была простой на вид: показать игроку только те базы, которые подходят его ратуше.
Что пошло не так в первой версии
Сначала я хранил уровень ратуши строкой ("TH16", "TH17"). Сортировка ломалась: "TH9" оказывался после "TH17". Перешёл на Int и отдельный вычисляемый заголовок для интерфейса.
struct Layout: Identifiable { let id: UUID let townHall: Int let kind: Kind // war, farm, trophy var title: String { "TH\(townHall)" } } Фильтр без лишних перерисовок
Фильтрую через вычисляемое свойство, а выбранную ратушу держу в @State. Список перерисовывается только при смене фильтра.
var filtered: [Layout] { layouts.filter { $0.townHall == selectedTH && $0.kind == selectedKind } } Что понравилось игрокам
Больше всего отзывов было не про сами базы, а про то, что фильтр запоминает последнюю ратушу. Мелочь, сохраняю её в @AppStorage, и при следующем запуске человек сразу видит свои базы.
Если интересно посмотреть, как это работает вживую, приложение называется Base Layouts: War & Farm Maps (я разработчик): https://apps.apple.com/app/apple-store/id6804564319?pt=2720803&ct=devto_ru&mt=8
Буду рад советам, как вы организуете фильтры в SwiftUI-списках.
