Latest web development tutorials

Swift закрытие

Затворы (Колпачки) является функциональным автономным блоком кода, вы можете использовать или использовать в качестве значения параметра в коде.

Swift замыкания в C и кода Objective-C блоков (блоков) и некоторых других языков программирования анонимная функция очень похожа.

Глобальные функции и вложенные функции на самом деле специальный замыкание.

Закрытие формы:

глобальные функции Вложенные функции укупорочные средства Expression
У меня есть имя, но не может захватить какое-либо значение. Она имеет имя, но и захватить значение в пределах функции закрыты. Безымянная закрытие, используйте легкий синтаксис, вы можете захватить значение, основанное на контексте.

Swift затворы имеют много оптимизации мест:

  1. В зависимости от параметра контекста и делать вывод типа возвращаемого значения
  2. С однострочного закрывающего выражение неявного возвращения (то есть, тело закрытие только одна строка кода, вы можете опустить возврат)
  3. Он может быть использован для упрощения имя параметра, такие как $ 0, $ 1 (от 0, что указывает, что I-й аргумент ...)
  4. Обеспечение синтаксиса закрытия Продольный (Скользящий синтаксис закрытия)
  5. грамматика

    Ниже определяет параметр приема и возвращает указанный тип синтаксиса закрытия:

    {(parameters) -> return type in
       statements
    }
    

    примеров

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

    Выход выше выполнение программы:

    Swift 闭包实例。
    

    Следующая форма закрытия принимает два параметра и возвращает логическое значение:

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

    Выход выше выполнение программы:

    10
    

    укупорочные средства Expression

    Затворы выражение является способ построения использование простых синтаксиса встроенных замыканий. Затворы синтаксис выражений обеспечивает некоторую оптимизацию таким образом, чтобы составить замыкание становится простым и понятным.


    функция сортировки

    Swift стандартная библиотека обеспечивает функции с именем рода, он будет отсортирован в соответствии с функцией закрытия вы предоставляете будет использоваться для сортировки известных значений типа в массиве.

    После завершения сортировки, сортировки (_ :) метод возвращает массив того же размера, что и оригинал, новый массив содержит один и тот же тип элемента и элемент был отсортирован, исходный массив не изменяется вид (_ :) методы.

    сортировать (_ :) метод принимает два аргумента:

    • Массив известного типа
    • Функция закрытия, эта функция замыкания необходимо передать массив элементов с одинаковым типом двух значений и возвращает логическое значение, указывающее, что первый параметр после окончания сортировки входящей строки перед или позади второго параметра. Если первые значения параметров появляются перед вторыми значениями параметров, сортировки функция закрытия должна вернуться true , наоборот , чтобы вернуться 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)
    

    Выход выше выполнение программы:

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

    Если строка первого символа (S 1) больше, чем второй строки (s2), в обратном направлении функция возвращает истину, что указывает на новый массив должен появиться перед s1 s2. Для символов в строке, "больше" означает "позже появляются в алфавитном порядке." Это означает, что буква "B" больше, чем буква "А", строка "S" больше, чем строка "D". Это будет обратный алфавитный рода, "AT" будет отсортирован перед "AE".


    Имя параметра аббревиатура

    Swift автоматически обеспечивает встраиваемую функцию имя параметра аббревиатуру, вы можете непосредственно через затворы параметра $ 1, $ 2 $ 0, чтобы позвонить заказ.

    примеров

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

    $ 0 и $ 1 для закрытия первого и второго параметра типа String.

    Выход выше выполнение программы:

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

    Если вы используете имя параметра аббревиатуру в выражении закрытия, вы можете список параметров закрытия его определение опущен, и соответствующее имя параметра типа сокращенного будет определен по типу функции. в ключевых словах он также может быть опущена.


    функция оператора

    На самом деле есть более короткий путь, чтобы написать приведенное выше выражение пример замыкания.

    Свифта String типа определяет на знак больше ( > реализации строка), как функцию , которая принимает два String параметр типа и возвращает Bool тип значения. Это совпало с sort(_:) тип функции второго параметра метода должен соответствовать. Таким образом, вы можете просто передать знак больше, Swift может автоматически сделать вывод, что вы хотите использовать больше, чем число строк функций для достижения:

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

    Выход выше выполнение программы:

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

    Скользящие Затворы

    Скользящий закрытие функция записывается в круглых скобках после закрытия выражений, функций для поддержки его вызова в качестве последнего параметра.

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

    примеров

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

    сортировать () после того, как {$ 0> $ 1} задней крышки.

    Выход выше выполнение программы:

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

    Примечание: Если функция только выражение закрытия одного параметра, при использовании задней закрытия, вы можете даже положить () опущены.

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

    Захваченные значение

    Затворы может быть постоянным или переменным захвата в контексте его определения.

    Даже определение этих констант и переменных исходного домена не существует, то замыкание может функционировать в естественных условиях закрытия ссылок и модификации этих значений.

    Быстрая простая форма закрытия вложен функции, функция определена в теле других функций функции.

    Вложенная функция может захватить все его внешних параметров функций и определенных констант и переменных.

    Посмотрите на этот пример:

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

    Функция makeIncrementor, она имеет параметр типа Int amout, и он имеет внешнее имя параметра forIncremet, означает, что, когда вы звоните, вы должны использовать внешнее имя. Возвращаемое значение является ()-> Int функция.

    В функции заголовка, объявить переменную и функцию runningTotal инкрементор.

    Функция инкрементор не получает каких-либо аргументов, но в теле функции для доступа к переменным runningTotal и сумму. Это потому, что он содержит тело функции, захватив существующую runningTotal и переменное количество реализуется.

    Поскольку не существует ни одна переменная величина модификации, инкрементор фактически захватить и сохранить копию переменной, которая хранится вместе с копией в качестве инкрементора.

    Поэтому, когда мы называем эту функцию будет накапливаться:

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

    Выход выше выполнение программы:

    10
    20
    30
    

    Затворы ссылочные типы

    В приведенном выше примере, incrementByTen постоянна, но точка закрытия этих констант можно еще увеличить значение его захвата переменной.

    Это происходит потому, что функции и замыкания являются ссылочными типами.

    вы ли функция / замыкание присваивается постоянной или переменной, вы на самом деле установки значения постоянных / переменных соответствующих ссылок функции / закрытия. В приведенном выше примере, incrementByTen закрытий опорная точка является константой, а не содержание самого закрытия.

    Это также означает, что если вы назначаете закрытия двух различных констант / переменных, оба значения будут указывать на тот же закрытия:

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

    Выход выше выполнение программы:

    50