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,
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:
Poniższy schemat określa parametr odbiorczej i zwraca określony rodzaj składni zamknięcia:
{(parameters) -> return type in statements }
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 }
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 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.
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:
true
, przeciwnie, aby powrócić 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)
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".
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.
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.
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"]
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() { // 闭包主体部分 }
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 }
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
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