Najlepszy samouczek Swift zamknięcia W 2024 r. W tym samouczku możesz dowiedzieć się zamknięcia ekspresyjne,Nazwa parametru skrót,funkcja operator,Zamknięcia wleczone,schwytany wartość,Zamknięcia są typy referencyjne,

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 pl.)
  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
Swift zamknięcia
10/30