Fundamentos de Closures
Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 38 de 56.
Uma closure é um bloco de código autônomo que você pode passar e chamar mais tarde. A sintaxe completa detalha os tipos de parâmetros e de retorno:
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10O Swift pode inferir os tipos quando o contexto está claro, então você raramente escreve a forma longa. Dentro de map, filter, etc., a forma abreviada mais curta é a norma:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // shortest, $0 is the first argClosures são valores, você pode armazená-los em variáveis, retorná-los de funções e passá-los como argumentos. Essa é a razão pela qual o map funciona.
Desafio
FácilLeia duas linhas de entrada:
- Um número inteiro
x - Uma lista de inteiros separados por vírgula
Defina três closures, cada uma do tipo (Int) -> Int:
addXadicionaxao seu argumentosquareretorna o argumento ao quadradonegateretorna o argumento negado
Aplique cada closure a cada elemento da lista usando map. Imprima três linhas, uma por closure, com os resultados unidos por ,:
addX: ...
square: ...
negate: ...Para a entrada 10 na linha 1 e 1,2,3 na linha 2, a saída é:
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3Folha de consulta
Uma closure é um bloco de código autônomo que pode ser armazenado e passado adiante. Sintaxe completa:
let double = { (n: Int) -> Int in
return n * 2
}Closures podem ser armazenadas em variáveis e passadas como argumentos (ex: para map). O Swift infere tipos no contexto, permitindo formas abreviadas:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // $0 é o primeiro argumentoExperimente você mesmo
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: definir três closures (Int) -> Int e mapear nums através de cada uma
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras8Closures
Fundamentos de ClosuresTrailing ClosuresCapturando ValoresRetornando ClosuresHigher-Order PersonalizadasRecapitulação - Pipeline Builder