Hola. Tengo una app gratuita para iOS que reúne diseños de aldea de Clash of Clans (guerra, farmeo y trofeos) con enlace para copiarlos al juego. Divulgación: la app es mÃa. En este post no quiero hablar de la app, sino de un problema que aparece en cualquier catálogo parecido: filtrar por nivel de Ayuntamiento sin que el código se complique.
1. Guarda el nivel como entero, no como texto
Si guardas "TH16" como cadena, ordenar se rompe enseguida ("TH9" queda detrás de "TH17"). Con un Int la ordenación es correcta y la etiqueta se genera solo en la vista.
enum Purpose: String, CaseIterable { case war, farm, trophy }
struct BaseLayout: Identifiable, Hashable {
let id: UUID
let townHall: Int
let purpose: Purpose
}
2. Un solo struct para todo el filtro
En lugar de varios @State sueltos, un struct con todos los criterios. El botón "Limpiar filtros" pasa a ser una sola lÃnea y es difÃcil olvidarse de alguno.
struct LayoutFilter: Equatable {
var townHall: Int? = nil
var purpose: Purpose? = nil
func matches(_ layout: BaseLayout) -> Bool {
(townHall == nil || layout.townHall == townHall) &&
(purpose == nil || layout.purpose == purpose)
}
}
3. Recuerda el último Ayuntamiento elegido
Casi todos los jugadores miran solo su propio nivel. Con @AppStorage la pantalla se abre directamente con su Ayuntamiento.
@AppStorage("lastTownHall") private var lastTownHall = 0
¿Vosotros filtráis en el cliente o hacéis la consulta en el servidor cuando la lista crece?
Por si alguien quiere ver la app: https://apps.apple.com/app/apple-store/id6804564319?pt=2720803&ct=devto_es&mt=8











