top of page

Melhorando seu código Swift com Higher-Order Functions

Aprenda de uma vez como funcionam as Higher-Order Functions e quando utilizá-las, com exemplos práticos para as funções map, filter, reduce, forEach e sorted.

O que são Higher-Order Functions?

As Higher-Order Functions são funções de um tipo especial que podem receber funções, ou closures, como parâmetro. Esse tipo de função pode ser aplicado em Arrays, Sets e Dicionários e atua transformando os itens que estão contidos nessas estruturas de dados.

O grande benefício de usar essas funções, é que o código acaba ficando mais conciso e reutilizável, uma vez que certos códigos comuns acabam sendo abstraídos por funções disponíveis na biblioteca padrão do Swift.

Higher-Order Functions em Swift

Nas subseções a seguir são apresentadas 5 Higher-Order Functions:
map, filter, reduce, forEach e sorted. A explicação de cada função está acompanhada de um exemplo de código antes da aplicação da função e outro com ela já aplicada. O objetivo com isso é demonstrar como essas funções melhoram a legibilidade do código e o deixam mais conciso, além de estimular a reflexão a respeito das possibilidades de cenários em que essas funções podem ser utilizadas.

map(_:)


A função map transforma os itens da estrutura de dados em que ela é usada e retorna uma nova estrutura com o resultado dessa transformação. Ou seja, ela não modifica a estrutura original, apenas atua sobre ela e retorna uma nova estrutura transformada.
💡 Quando utilizar: Quando se deseja transformar cada elemento de uma estrutura em algo novo.

Exemplo

Para exemplificar como a função pode ajudar a melhorar seu código, aqui está um exemplo de um algoritmo que formata uma lista de strings, deixando-as todas em maiúsculas.


Sem map


Com map


Sim, é lindo e reduz seu código pela metade!

 

filter(_:)


Como o próprio nome sugere, a função filter realiza um filtro em uma estrutura de dados com base na condição que foi passada por parâmetro. Dessa forma, também não altera a estrutura original, apenas a percorre e devolve os elementos de acordo com o filtro especificado.
💡 Quando utilizar: Quando se deseja selecionar apenas os elementos que satisfazem uma condição.

Exemplo

O exemplo a seguir mostra um algoritmo antes e depois de aplicar a função filter. O objetivo do algoritmo é fazer um filtro em uma lista de filmes buscando somente pelos filmes favoritos, que são identificados pela avaliação igual a 5.

Sem filter


Com filter (+bônus de outro exemplo com map)


 

reduce(_:_:)


A função reduce percorre a estrutura de dados, aplica a operação designada e reduz tudo a um único resultado. Ou seja, dada uma coleção de elementos, a função combina esses elementos e devolve somente um valor.
💡 Quando utilizar: Quando se deseja reduzir os elementos de uma coleção a um único valor.

Exemplo

Para demonstrar como a função reduce pode simplificar o código, o exemplo a seguir contém um algoritmo antes e depois de aplicá-la. O objetivo do algoritmo é encontrar a duração de um álbum musical baseado na duração de cada música.

Sem reduce


Com reduce


 

forEach(_:)


Dada uma estrutura de dados, o forEach a percorre e aplica a função passada por parâmetro a cada elemento dessa estrutura. Além disso, diferente das funções citadas anteriormente, o forEach não retorna uma nova estrutura de dados transformada e nem transforma a estrutura original, apenas a percorre.
💡 Quando utilizar: Quando se deseja aplicar uma ação a cada elemento de uma coleção sem alterá-la.

Exemplo

O exemplo a seguir mostra o antes e depois do uso da função forEach em um algoritmo que percorre a estrutura de um álbum musical e mostra os títulos das músicas.

Sem forEach


Com forEach


 

sorted(by:)


A função sorted ordena os elementos presentes em uma estrutura de dados usando uma função de comparação. Ela ordena os elementos e devolve uma nova estrutura com o resultado da ordenação. De acordo com a própria documentação da linguagem, a complexidade desse algoritmo é de O(n log n), sendo n o tamanho da estrutura de dados.
💡 Quando utilizar: Quando se deseja ordenar os elementos de uma coleção.

Exemplo

O exemplo a seguir mostra como é vantajoso utilizar o sorted. O objetivo do algoritmo de exemplo é fazer a ordenação por avaliação, da maior para menor, de uma lista de filmes.

Sem sorted

No exemplo, foi feito uso do algoritmo de ordenação Bubble Sort, que possui uma implementação simples e fácil de entender. No entanto, além de ser perceptível que o código fica mais longo, a complexidade desse algoritmo é de O(n^2), o que é um desempenho pior que o da função sorted (que é O(n log n)).


Com sorted (+bônus de outro exemplo com forEach)


 

Considerações Finais

Através dos exemplos, foi possível demonstrar como as Higher-Order Functions podem simplificar o código, na maioria das vezes, com apenas 1 linha. Além disso, através do exemplo de sorted, foi comprovado que certos códigos comuns podem ser abstraídos pelas implementações padrões da linguagem Swift, ou seja, ao invés de implementar um algoritmo de ordenação do zero, que possui sempre o mesmo código, basta utilizar a função sorted que já possui essa implementação abstraída e, inclusive, com um ótimo desempenho.

Caso tenha ficado com alguma dúvida, ou tenha sugestões ou outros comentários, envie um email para info@leticiaportela.com
 

Referências



  Gostou desse conteúdo? Clique no botão abaixo para apoiar pelo Github Sponsors :)



0 comentário

Comments


bottom of page