Acho que a forma como foi solicitada essa implementação no desafio não faz muito sentido. Ninguém pesquisa um restaurante que esteja "entre 20 e 25km" do local. O que o usuário quer é um restaurante que esteja entre zero e X km do local. Se ele estiver com muita pressa, pode selecionar apenas os que estão perto (entre 0 e 5km). Se quiser ver mais opções, pode aumentar o filtro e mostrar até 20km (entre ZERO e 20km).
Assim, a implementação do filtro de distância fica basicamente uma cópia do filtro de estrelas, somente invertendo o sinal da comparação na variável computada de lojas filtradas. Eu fiz assim:
- Declarei somente um filtro de distância
@State private var filtroDistancia:Double = 25
- Adicionei a comparação invertida na variável computada (nos filtros, queremos que as estrelas da loja tenham valor MAIOR que o filtro. Na distância, queremos que a distância da loja tenha valor MENOR que o filtro)
var lojasFiltradas: [TipoLoja] {
return lojasMock.filter { loja in
loja.estrelas >= filtroEstrelas && (loja.distancia <= filtroDistancia)
}
}
- Implementei o filtro, em que o botão "limpar filtro" volte pro filtro máximo (assim todos os restaurantes são mostrados) e os botões de cada filtro diminuam o valor.
// FILTRO POR DISTÂNCIA
Menu("Distância") {
Button(action: {
filtroDistancia = 25
}, label: {
Text("Limpar Filtro")
})
Divider()
ForEach(1...5, id: \.self) { distancia in
Button(action: {
filtroDistancia = Double(distancia * 5)
}, label: {
Text("Até \(distancia * 5)km")
})
}
}
Considerei a possibilidade da aula ter sido montada dessa forma por questão somente didática, pra ensinar a fazer um filtro mais complexo. Mas considerando que estamos fazendo o aplicativo baseado no iFood, acho que as funcionalidades deveriam ser baseadas na realidade.
Se for o caso, cabe um exemplo diferente, pensei em um aplicativo que mostre uma lista de investimentos; poderíamos selecionar um filtro de prazos (resgate imediato ou até 30 dias; entre 30 e 90 dias; entre 90 e 180 dias; etc), ou talvez faixas de rentabilidades diferentes. Assim faria mais sentido um filtro da forma do desafio.
Se alguém tiver lido o textão todo, deixo também essa curiosidade que descobri:
Dá pra customizar a largura do Divider()
usando o .frame
Divider()
.frame(maxHeight: 25)
.frame(width: 3)
.overlay(Color("RedLight"))
Achei que o resultado ficou bonito: