Latest web development tutorials

Swift zamknięcia

Zamknięcia (Zamknięcia) jest funkcjonalnym samowystarczalny blok kodu, można użyć lub być wykorzystywane jako wartość parametru w kodzie.

Swift zamknięcia w C i bloków kodu Objective-C (bloki) oraz niektórych innych języków programowania funkcja anonimowa jest dość podobna.

Globalne oraz funkcje zagnieżdżone jest rzeczywiście specjalnego zamknięcia.

Zamknięcie formularza:

Funkcje globalne funkcje zagnieżdżone zamknięcia ekspresyjne
Mam imię, ale nie mogę uchwycić żadnej wartości. Ma nazwę, ale także do wychwytywania wartości w funkcji zamknięte. Nameless zamknięcia, użyj lekkiego składni, można uchwycić wartość na podstawie kontekstu.

Swift zamknięcia mają wiele miejsc optymalizacji:

  1. W zależności od parametrów kontekstu wywnioskować typ i wartość powrotu
  2. Od jednowierszowym zamknięcia wyraz niejawny zwrotu (czyli korpus zamknięcia jest tylko jedna linia kodu, można pominąć zwrot)
  3. Może być stosowany w celu uproszczenia nazwę parametru, takie jak $ 0, $ 1 (od 0, co oznacza, że ​​i-tego argumentu ...)
  4. Zapewnienie składnia zamknięcia spływu (Trailing składnia zamknięcia)
  5. gramatyka

    Poniższy schemat określa parametr odbiorczej i zwraca określony rodzaj składni zamknięcia:

    {(parameters) -> return type in
       statements
    }
    

    Przykłady

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

    Wyjście powyżej wykonywanie programu jest:

    Swift 闭包实例。
    

    Poniższy formularz zamknięcia przyjmuje dwa parametry i zwraca wartość logiczną:

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

    Przykłady

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

    Wyjście powyżej wykonywanie programu jest:

    10
    

    zamknięcia ekspresyjne

    Zamknięcia wyrażenie jest sposobem na budowanie stosowanie prostych zamknięć składni inline. Składnia wyrażeń Zamknięcia zapewnia pewną optymalizację tak aby skomponować zamknięcie staje się proste i jasne.


    funkcja sortowania

    Swift Standardowa biblioteka zapewnia funkcja o nazwie sort, zostanie posortowana według funkcji zamknięcia Ciebie informacje zostaną użyte do sortowania znane Wpisz wartości w tablicy.

    Po zakończeniu sortowania, sortowanie (_ :) Metoda zwraca tablicę o tym samym rozmiarze co oryginał, nowa tablica zawiera ten sam typ elementu i element został prawidłowo sortowane, oryginalna tablica nie jest modyfikowana sort (_ :) metod.

    sort (_ :) Metoda przyjmuje dwa argumenty:

    • Tablica znanego typu
    • Funkcja Zamknięcie, że zamknięcia funkcji trzeba przekazać tablicę elementów o tym samym typie dwóch wartości i zwraca wartość logiczną, aby wskazać, że pierwszy parametr po zakończeniu sortowania rzędu przychodzącego z przodu lub z tyłu drugi parametr. Jeśli pierwsze Wartości parametrów pojawiają się przed drugimi wartości parametrów, sortowania funkcja zamykająca musi powrócić true , przeciwnie, aby powrócić false .

    Przykłady

    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)
    

    Wyjście powyżej wykonywanie programu jest:

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

    Jeśli łańcuch pierwszy znak (s1) jest większy niż drugi ciąg (S2), do tyłu, funkcja zwraca wartość true, wskazuje, że nowa tablica powinna pojawić się przed S1 S2. Dla znaków w łańcuchu, w "większy niż" oznacza "później wyświetlane w kolejności alfabetycznej." Oznacza to, że litera "B" jest większy niż litera "A" ciąg "S" jest większa niż smyczkowy "D". Będzie to coś w rodzaju odwróconej kolejności alfabetycznej, "AT" będą sortowane przed "AE".


    Nazwa parametru skrót

    Swift automatycznie udostępnia funkcję inline skrót nazwy parametru, możesz bezpośrednio przez $ 0 parametrów zamknięć $ 1, $ 2, aby wywołać zamówienia.

    Przykłady

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

    $ 0 oraz $ 1 dla zamknięcia pierwszy i drugi parametr typu String.

    Wyjście powyżej wykonywanie programu jest:

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

    Jeśli używać skrótu nazwy parametru w wyrażeniu zamknięcia, można lista parametrów zamknięcia jej definicja jest pominięte, a odpowiednie typy Skrót nazwy parametru będzie wnioskować o rodzaju funkcji. w kluczowych może również zostać pominięty.


    funkcja operator

    W rzeczywistości nie jest to krótsza droga do napisania powyższego wyrażenia przykład zamknięć.

    Swift String typu określa się na większą niż znak ( > ciąg) implementacji jako funkcja, która trwa dwa String parametr typu i zwraca Bool typ wartości. Zbiegło się to z sort(_:) funkcją typu drugiego parametru metody muszą być zgodne. W związku z tym, można po prostu przejść większy niż znak, Swift może automatycznie wnioskować, że chcesz użyć jest większa niż liczba funkcji łańcuchowych mające na celu:

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

    Wyjście powyżej wykonywanie programu jest:

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

    Zamknięcia wleczone

    Końcowe zamknięcie jest funkcją napisane w nawiasie po zamknięciu wyrażeń funkcji wspierać swoje wezwanie jako ostatni parametr.

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

    Przykłady

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

    sort () {$ po 0>, $ 1} spływu zamknięcia.

    Wyjście powyżej wykonywanie programu jest:

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

    Uwaga: Jeśli funkcja tylko jeden parametr wyrażenie zamknięcia, podczas korzystania spływu zamknięć, można nawet umieścić () pominięte.

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

    schwytany wartość

    Zamknięcia mogą być stałe lub zmienne uchwycenia w kontekście jego definicji.

    Nawet definicja tych stałych i zmiennych w oryginalnej domenie nie istnieje, zamknięcie może nadal funkcjonować vivo zamknięcia odwoływania i modyfikowania tych wartości w.

    Szybka najprostszy postać zamknięcia jest funkcją zagnieżdżone funkcja jest określona w organizmie inne funkcje funkcji.

    Funkcja zagnieżdżona może uchwycić wszystkie jego zewnętrznych parametrów funkcyjnych oraz zdefiniowanych stałych i zmiennych.

    Spójrz na ten przykład:

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

    Funkcja makeIncrementor, ma parametr typu int amout i ma zewnętrzną nazwę parametru forIncremet oznacza, że ​​podczas rozmowy, należy użyć nazwy zewnętrzne. Wartością zwracaną jest ()-> Int funkcji.

    W funkcji tytułowym zadeklarować zmienną i incrementor Funkcja runningTotal.

    Funkcja incrementor nie dostaje żadnych argumentów, ale w ciele funkcji, aby uzyskać dostęp do zmiennych runningTotal i ilości. To dlatego, że zawiera ciało funkcji poprzez przechwytywanie istniejącego runningTotal i zmienną ilość zrealizowane.

    Ponieważ nie istnieje pewna ilość modyfikacji, incrementor faktycznie rejestrować i przechowywać kopię zmiennej, która jest przechowywana wraz z kopią jako incrementor.

    Kiedy więc wywołać tę funkcję będzie gromadził:

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

    Wyjście powyżej wykonywanie programu jest:

    10
    20
    30
    

    Zamknięcia są typy referencyjne

    Powyższy przykład, incrementByTen jest stała, ale punkt zamknięcia tych stałych można jeszcze zwiększyć wartość swojej zmiennej przechwytywania.

    To dlatego, że funkcje i zamknięcia są typy referencyjne.

    Niezależnie od tego czy funkcja / zamknięcia przypisane do stałej lub zmiennej, to są rzeczywiście ustawienie wartości stałych zmiennych odpowiednich referencji / Funkcja / zamknięcia. W powyższym przykładzie, incrementByTen closures punkt odniesienia jest wartością stałą, zamiast zawartości samego zamknięcia.

    Oznacza to również, że jeśli przypisać zamknięcie dwóch różnych stałych / zmiennych, obie wartości będą wskazywać na tym samym zamknięcia:

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

    Wyjście powyżej wykonywanie programu jest:

    50