O melhor tutorial fechamento Swift em 2024. Neste tutorial você pode aprender encerramentos de expressão,nome abreviatura de parâmetro,função de operador,arrasto Closures,valor capturado,Closures são tipos de referência,
Closures (tampas) é um bloco independente funcional do código, você pode usar ou ser usado como um valor de parâmetro no código.
fechos rápidos em C e blocos de código Objective-C (blocos) e algumas outras linguagens de programação função anônima é bastante semelhante.
funções globais e funções aninhadas é realmente um fecho especial.
Encerramento da forma:
Funções globais | funções aninhadas | encerramentos de expressão |
Eu tenho um nome, mas não pode capturar qualquer valor. | Ele tem um nome, mas também para capturar o valor dentro da função fechada. | fechamento Nameless, use uma sintaxe leve, você pode capturar o valor com base no contexto. |
fechamento de Swift tem um monte de lugares de otimização:
O seguinte define um parâmetro de recepção e retorna o tipo especificado de sintaxe de fechamento:
{(parameters) -> return type in statements }
import Cocoa let studname = { print("Swift 闭包实例。") } studname()
A saída de execução de programa acima é:
Swift 闭包实例。
O seguinte formulário fechamentos leva dois parâmetros e retorna um valor booleano:
{(Int, Int) -> Bool in Statement1 Statement 2 --- Statement n }
import Cocoa let divide = {(val1: Int, val2: Int) -> Int in return val1 / val2 } let result = divide(200, 20) print (result)
A saída de execução de programa acima é:
10
expressão Closures é uma forma de construir o uso de encerramentos de sintaxe em linha simples. sintaxe de expressão encerramentos fornece alguma otimização de modo que compõem o fecho torna-se simples e clara.
Swift biblioteca padrão fornece uma função chamada sorte, ele serão classificados de acordo com a função de fechamento fornecidas serão usadas para classificar os valores tipo conhecido na matriz.
Após a conclusão do tipo, espécie (_ :) método retorna uma matriz do mesmo tamanho que o original, a nova matriz contém o mesmo tipo de elemento eo elemento foi devidamente ordenados, a matriz original não é modificada sort (_ :) métodos.
sort (_ :) método leva dois argumentos:
true
, ao contrário do regresso false
. import Cocoa let names = ["AT", "AE", "D", "S", "BE"] // 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。 func backwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = names.sort(backwards) print(reversed)
A saída de execução de programa acima é:
["S", "D", "BE", "AT", "AE"]
Se a cadeia primeiro caractere (S1) é maior do que a segunda cadeia (s2), para trás função retorna true, indicando que a nova matriz deve aparecer antes s2 s1. Para os caracteres na seqüência, a "maior que" significa "depois aparecem em ordem alfabética." Isto significa que a letra "B" é maior do que a letra "A", a cadeia "S" é maior do que a cadeia "D". Ele irá reverter classificação alfabética, "AT" serão classificados antes "AE".
Swift fornece automaticamente um nome de parâmetro função inline abreviatura, você pode diretamente através dos $ 0 encerramentos de parâmetros de US $ 1, US $ 2 para chamar ordem.
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] var reversed = names.sort( { $0 > $1 } ) print(reversed)
$ 0 e US $ 1 para o encerramento do primeiro eo segundo parâmetro do tipo String.
A saída de execução de programa acima é:
["S", "D", "BE", "AT", "AE"]
Se você usar o nome do parâmetro abreviatura da expressão fechamento, você pode lista de parâmetros de encerramento sua definição é omitida, e os tipos sigla nome de parâmetro correspondentes serão inferidos por tipo de função. em palavras-chave pode também ser omitido.
De fato, há um caminho mais curto para escrever a expressão acima exemplo encerramentos.
Swift String
tipo define em sinal de maior ( >
implementação string), como uma função que leva dois String
parâmetro de tipo e retorna um Bool
tipo de valor. Isso coincidiu com a sort(_:)
função tipo do segundo parâmetro do método precisa se conformar. Portanto, você pode simplesmente passar um sinal de maior, Swift pode inferir automaticamente que você deseja usar é maior do que o número de funções de cadeia para atingir:
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] var reversed = names.sort(>) print(reversed)
A saída de execução de programa acima é:
["S", "D", "BE", "AT", "AE"]
À direita de fechamento é uma função escrito entre parênteses após o encerramento das expressões, funções para apoiar o seu apelo como o último parâmetro.
func someFunctionThatTakesAClosure(closure: () -> Void) { // 函数体部分 } // 以下是不使用尾随闭包进行函数调用 someFunctionThatTakesAClosure({ // 闭包主体部分 }) // 以下是使用尾随闭包进行函数调用 someFunctionThatTakesAClosure() { // 闭包主体部分 }
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] //尾随闭包 var reversed = names.sort() { $0 > $1 } print(reversed)
sort () depois de {$ 0> $ 1} fechamento de fuga.
A saída de execução de programa acima é:
["S", "D", "BE", "AT", "AE"]
Nota: Se a função de apenas um parâmetro fechamento de expressão, quando você usa arrastando fechamentos, você pode até mesmo colocar
()
omitido.reversed = names.sort { $0 > $1 }
Os fechos de captura pode ser constante ou variável no âmbito da sua definição.
Mesmo a definição dessas constantes e variáveis do domínio original não existe, o fechamento pode ainda funcionar in vivo referenciamento encerramento e alteração desses valores.
Swift forma mais fácil de fecho está aninhado função, a função é definida no corpo das outras funções da função.
A função aninhada pode capturar todos os seus parâmetros de função externos e constantes definidas e variáveis.
Veja este exemplo:
func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor }
A makeIncrementor função, ele tem um parâmetro do tipo amout Int, e tem um nome de parâmetro forIncremet externa, significa que quando você chama, você deve usar o nome externo. O valor de retorno é um ()-> Int
função.
Na função título, declarar uma variável e uma incrementor função RunningTotal.
função incrementor não recebe nenhum argumento, mas no corpo da função para acessar as variáveis RunningTotal e quantidade. Isto é porque contém o corpo de a função de reter a sua RunningTotal existente e quantidade variável realizado.
Desde que não há nenhuma variável quantidade modificação, incrementor realmente capturar e armazenar uma cópia da variável, que é armazenado juntamente com uma cópia como incrementor.
Então, quando nós chamamos esta função irá acumular:
import Cocoa func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } let incrementByTen = makeIncrementor(forIncrement: 10) // 返回的值为10 print(incrementByTen()) // 返回的值为20 print(incrementByTen()) // 返回的值为30 print(incrementByTen())
A saída de execução de programa acima é:
10 20 30
O exemplo acima, incrementByTen é constante, mas o ponto de fecho destas constantes ainda pode aumentar o valor da sua captura variável.
Isso ocorre porque as funções e fechamentos são tipos de referência.
Se você é uma função / fechamento atribuído a uma constante ou variável, na verdade você está definindo o valor das referências constantes / variáveis correspondentes função / encerramento. O exemplo acima, incrementByTen fechos ponto de referência é uma constante, em vez de o conteúdo do próprio fecho.
Isto também significa que se você atribuir o encerramento das duas diferentes constantes / variáveis, ambos os valores irão apontar para o mesmo fechamento:
import Cocoa func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } let incrementByTen = makeIncrementor(forIncrement: 10) // 返回的值为10 incrementByTen() // 返回的值为20 incrementByTen() // 返回的值为30 incrementByTen() // 返回的值为40 incrementByTen() let alsoIncrementByTen = incrementByTen // 返回的值也为50 print(alsoIncrementByTen())
A saída de execução de programa acima é:
50