Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio: implemente uma filtragem de distância / a lógica não faz muito sentido...

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:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Oie Arthur!!

De fato, foi algo pensado mais na didática, só pra darmos um exemplo de filtragem, mas você pode implementar outros exemplos, inclusive temos um desafio nesta aula pra você implementar sob outras características. Sua solução é super válida, obrigada por compartilhar! Abraços!