Latest web development tutorials

fechamento Swift

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:

  1. Dependendo do parâmetro de contexto inferir e valor de retorno Tipo
  2. A partir de uma única linha de fecho expressão de retorno implícita (ou seja, o corpo de fecho é apenas uma linha de código, você pode omitir o retorno)
  3. Ele pode ser usado para simplificar o nome do parâmetro, tal como 0 $, $ 1 (a partir de 0, indicando que o argumento de ordem i ...)
  4. Fornecendo sintaxe fechamento final (Trailing sintaxe fechamento)
  5. gramática

    O seguinte define um parâmetro de recepção e retorna o tipo especificado de sintaxe de fechamento:

    {(parameters) -> return type in
       statements
    }
    

    Exemplos

    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
    }
    

    Exemplos

    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
    

    encerramentos de expressão

    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.


    função de classificação

    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:

    • Uma matriz de tipo conhecido
    • função de fecho, que os fechos de função precisa passar uma matriz de elementos com o mesmo tipo de dois valores e retorna um valor booleano para indicar que o primeiro parâmetro após o fim da linha de entrada de triagem em frente ou atrás do segundo parâmetro. Se os primeiros valores dos parâmetros aparecem na frente do segundo valores de parâmetros, classificar a função de fecho tem de voltar true , ao contrário do regresso false .

    Exemplos

    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".


    nome abreviatura de parâmetro

    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.

    Exemplos

    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.


    função de operador

    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"]
    

    arrasto Closures

    À 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() {
      // 闭包主体部分
    }
    

    Exemplos

    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 }
    

    valor capturado

    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
    

    Closures são tipos de referência

    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