Latest web development tutorials

cierre de Swift

Los cierres (vedas) es un bloque autónomo funcional de código, puede utilizar o ser utilizado como valor de parámetro en el código.

el cierre de Swift en C y bloques de código de Objective-C (bloques) y algunos otros lenguajes de programación función anónima es bastante similar.

funciones globales y funciones anidadas es en realidad un cierre especial.

Cierre de la forma:

Funciones globales funciones anidadas cierres de expresión
Tengo un nombre, pero no puedo capturar cualquier valor. Tiene un nombre, sino también para capturar valor dentro de la función cerrada. Cierre sin nombre, utilizar la sintaxis de peso ligero, puede capturar el valor en función del contexto.

Swift cierres tienen una gran cantidad de lugares de optimización:

  1. Dependiendo del tipo de parámetro de contexto inferir y valor de retorno
  2. A partir de una sola línea de cierre expresión de retorno implícita (es decir, el cuerpo de cierre es sólo una línea de código, se puede omitir el retorno)
  3. Se puede utilizar para simplificar el nombre del parámetro, tales como $ 0, $ 1 (de 0, lo que indica que el argumento i-ésimo ...)
  4. Proporcionar la sintaxis de cierre final (la sintaxis de cierre al final)
  5. gramática

    A continuación se define un parámetro que recibe y devuelve el tipo específico de la sintaxis de cierre:

    {(parameters) -> return type in
       statements
    }
    

    Ejemplos

    import Cocoa
    
    let studname = { print("Swift 闭包实例。") }
    studname()
    

    La salida por encima de la ejecución del programa es:

    Swift 闭包实例。
    

    El siguiente formulario cierres toma dos parámetros y devuelve un valor booleano:

    {(Int, Int) -> Bool in
       Statement1
       Statement 2
        ---
       Statement n
    }
    

    Ejemplos

    import Cocoa
    
    let divide = {(val1: Int, val2: Int) -> Int in 
       return val1 / val2 
    }
    let result = divide(200, 20)
    print (result)
    

    La salida por encima de la ejecución del programa es:

    10
    

    cierres de expresión

    Los cierres de expresión es una manera de construir el uso de simples cierres línea de sintaxis. Sintaxis de las expresiones cierres proporciona una optimización de modo que componen el cierre se convierte en simple y clara.


    función de clasificación

    Swift biblioteca estándar proporciona una función denominada clase, que serán ordenados de acuerdo a la función de cierre que proporcione será utilizada para ordenar los valores de tipo conocido en la matriz.

    Después de la finalización de la clasificación, clasificación (_ :) método devuelve una matriz del mismo tamaño que el original, la nueva matriz contiene el mismo tipo de elemento y el elemento ha sido solucionado correctamente, la matriz original no se modifica especie (_ :) métodos.

    sort (_ :) método toma dos argumentos:

    • Una matriz de tipo conocido
    • función de cierre, que los cierres de función tiene que pasar una matriz de elementos con el mismo tipo de dos valores y devuelve un valor booleano para indicar que el primer parámetro después del final de la fila de entrada de clasificación por delante o por detrás del segundo parámetro. Si los primeros valores de los parámetros aparecen delante de los segundos valores de los parámetros, ordenar la función de cierre tiene que volver true , en contra de volver false .

    Ejemplos

    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)
    

    La salida por encima de la ejecución del programa es:

    ["S", "D", "BE", "AT", "AE"]
    

    Si la cadena de caracteres primero (S1) es mayor que la segunda cadena (s2), hacia atrás función retorna verdadero, lo que indica que la nueva matriz debería aparecer antes s2 s1. Para los caracteres de la cadena, el "mayor que" significa "más adelante aparecen en orden alfabético." Esto significa que la letra "B" es mayor que la letra "A", la cadena "S" es mayor que la cadena "D". Ésta no revierta clasificación alfabética, "AT" se clasifican antes "AE".


    Nombre del parámetro abreviatura

    Swift proporciona automáticamente una función en línea nombre del parámetro abreviatura, puede directamente a través de los parámetros $ 0 cierres de $ 1, $ 2 para llamar a la orden.

    Ejemplos

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort( { $0 > $1 } )
    print(reversed)
    

    $ 0 y $ 1 para el cierre del primer y el segundo parámetro de tipo String.

    La salida por encima de la ejecución del programa es:

    ["S", "D", "BE", "AT", "AE"]
    

    Si se utiliza el nombre del parámetro abreviatura de la expresión de cierre, puede lista de parámetros de cierre se omite su definición, y el correspondiente nombre de parámetro tipos acrónimo será inferido por tipo de función. en palabras clave también puede ser omitido.


    función de operador

    De hecho, hay un camino más corto para escribir la expresión ejemplo, cierres de seguridad.

    de Swift String tipo define el signo mayor que ( > aplicación de cuerdas), como una función que toma dos String parámetro de tipo y devuelve un Bool tipo de valor. Esto coincidió con la sort(_:) función de tipo del segundo parámetro del método tiene que conformarse. Por lo tanto, usted puede simplemente pasar un signo de mayor que, Swift puede inferir automáticamente que desea utilizar es mayor que el número de funciones de cadena para lograr:

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort(>)
    print(reversed)
    

    La salida por encima de la ejecución del programa es:

    ["S", "D", "BE", "AT", "AE"]
    

    Los cierres se arrastran

    Arrastrando cierre es una función escrita entre paréntesis después del cierre de las expresiones, funciones para apoyar su llamamiento como el último parámetro.

    func someFunctionThatTakesAClosure(closure: () -> Void) {
        // 函数体部分
    }
    
    // 以下是不使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure({
        // 闭包主体部分
    })
    
    // 以下是使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure() {
      // 闭包主体部分
    }
    

    Ejemplos

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    //尾随闭包
    var reversed = names.sort() { $0 > $1 }
    print(reversed)
    

    sort () después de {$ 0> $ 1} de cierre posterior.

    La salida por encima de la ejecución del programa es:

    ["S", "D", "BE", "AT", "AE"]
    

    Nota: Si la función de un solo parámetro de expresión cierres, cuando se utiliza el cierre trasero, incluso se puede poner () omitido.

    reversed = names.sort { $0 > $1 }
    

    valor capturado

    Los cierres pueden ser captura constante o variable en el contexto de su definición.

    Incluso la definición de estas constantes y variables del dominio original no existe, el cierre puede seguir funcionando vivo referenciación de cierre y la modificación de estos valores en.

    Swift forma más fácil de cierre está función anidada, la función se define en el cuerpo de las otras funciones de la función.

    La función anidada puede capturar todos sus parámetros a funciones externas y las constantes y variables definidas.

    Mira este ejemplo:

    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    

    Un makeIncrementor función, que tiene un parámetro de amout tipo int, y tiene un nombre de parámetro forIncremet externa, significa que cuando llame, debe utilizar el nombre externo. El valor de retorno es una ()-> Int función.

    En la función del título, declarar una variable y una función incrementor RunningTotal.

    incrementor función no recibe ningún argumento, pero en el cuerpo de la función para acceder a las variables RunningTotal y cantidad. Esto es debido a que contiene el cuerpo de la función mediante la captura de su RunningTotal existente y cantidad variable realizado.

    Puesto que no hay variable de cantidad modificación, incrementor realmente capturar y almacenar una copia de la variable, que se almacena junto con una copia como incrementor.

    Así que cuando llamamos a esta función se 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())
    

    La salida por encima de la ejecución del programa es:

    10
    20
    30
    

    Los cierres son los tipos de referencia

    El ejemplo anterior, incrementByTen es constante, pero el punto de cierre de estas constantes aún puede aumentar el valor de su captura variable.

    Esto se debe a las funciones y los cierres son los tipos de referencia.

    Si usted es una función / de cierre asignado a una constante o variable, en realidad se está estableciendo el valor de las referencias constantes / variables correspondientes funciones / cierre. El ejemplo anterior, incrementByTen cierres punto de referencia es una constante, en lugar del contenido del propio cierre.

    Esto también significa que si se asigna el cierre de las dos constantes / variables diferentes, ambos valores se apuntan a la misma conclusión:

    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())
    

    La salida por encima de la ejecución del programa es:

    50