Swift – zamknięcia

ogłoszenia

zamknięcia w języku Swift 4 są podobne do funkcji samodzielnych zorganizowanych jako bloki i wywoływanych w dowolnym miejscu, jak języki C i Objective C. Stałe i odwołania do zmiennych zdefiniowane wewnątrz funkcji są przechwytywane i przechowywane w zamknięciach. Funkcje są uważane za szczególne przypadki zamknięcia i przyjmuje następujące trzy formy−

funkcje globalne funkcje zagnieżdżone wyrażenia zamknięcia
miej imię. Nie przechwytywaj żadnych wartości mają nazwę. Przechwytywanie wartości z funkcji zamykającej nienazwane zamknięcia przechwytywanie wartości z sąsiednich bloków

wyrażenia zamknięcia w języku Swift 4 podążają za wyraźnymi, optymalizacyjnymi i lekkimi stylami składni, które obejmują.

  • wnioskowanie parametrów i zwracanie typów wartości z kontekstu.
  • Implicit returns from single-expression closures.
  • skrócone nazwy argumentów i
  • składnia kończącego zamykania

składnia

poniżej znajduje się ogólna składnia definiująca zamykanie, która akceptuje parametry i zwraca typ danych−

{ (parameters) −> return type in statements}

Poniżej znajduje się prosty przykład−

let studname = { print("Welcome to Swift Closures") }studname()

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

Welcome to Swift Closures

następujące zamknięcie akceptuje dwa parametry i zwraca wartość Bool−

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

Poniżej znajduje się prosty przykład−

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

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

10

wyrażenia w zamknięciach

funkcje zagnieżdżone zapewniają wygodny sposób nazywania i definiowania bloków kodu. Zamiast reprezentować całą funkcję, deklaracje i nazwy są używane do oznaczania krótszych funkcji. Reprezentowanie funkcji w jasnym krótkim oświadczeniu ze składnią skupioną jest osiągane poprzez wyrażenia zamknięcia.

program kolejności rosnącej

sortowanie ciągu znaków jest osiągane za pomocą funkcji zarezerwowanej dla klucza Swift 4S „sorted”, która jest już dostępna w bibliotece standardowej. Funkcja posortuje podane ciągi znaków w kolejności rosnącej i zwraca elementy w nowej tablicy o tym samym rozmiarze i typie danych wymienionym w starej tablicy. Stara tablica pozostaje taka sama.

dwa argumenty są reprezentowane wewnątrz funkcji posortowanej−

  • wartości znanego typu reprezentowane jako tablice.

  • zawartość tablicy (Int, Int) i zwraca wartość logiczną (Bool) jeżeli tablica jest poprawnie posortowana zwróci wartość true, w przeciwnym razie zwróci wartość false.

normalna funkcja z łańcuchem wejściowym jest zapisywana i przekazywana do posortowanej funkcji, aby posortować łańcuchy do nowej tablicy, która jest pokazana poniżej−

func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)

gdy uruchamiamy powyższy program używając playground, otrzymujemy następujący wynik−

true

początkowa tablica do posortowania dla icecream jest podana jako „Swift 4” i „great”. Funkcja sortująca tablicę jest zadeklarowana jako string datatype, a jej typ zwracany jest jako Boolean. Oba ciągi są porównywane i sortowane w kolejności rosnącej i przechowywane w nowej tablicy. Jeśli sortowanie zakończy się powodzeniem, funkcja zwróci wartość true, w przeciwnym razie zwróci wartość false.

użycie składni wyrażenia zamknięcia−

  • parametry stałe,
  • parametry zmienne i
  • parametry inout.

wyrażenie zamknięcia nie obsługuje wartości domyślnych. Zmienne parametry i krotki mogą być również używane jako typy parametrów i typy zwracane.

let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−

30

parametry i deklaracje typu return wymienione w instrukcji function mogą być również reprezentowane przez funkcję inline Closure expression ze słowem kluczowym „in”. Po zadeklarowaniu parametru i zwróceniu typów ” in ” słowo kluczowe jest używane do oznaczenia, że ciało zamknięcia.

pojedyncze wyrażenie Implicit zwraca

tutaj typ funkcji drugiego argumentu posortowanej funkcji wyjaśnia, że wartość Bool musi zostać zwrócona przez zamknięcie. Ponieważ ciało zamknięcia zawiera jedno wyrażenie (s1 > s2), które zwraca wartość Bool, nie ma dwuznaczności, a słowo kluczowe return może zostać pominięte.

aby zwrócić pojedyncze wyrażenie w zamknięciach wyrażenia słowo kluczowe „return” jest pomijane w części deklaracji.

var count: = let descending = count.sorted(by: { n1, n2 in n1 > n2 })let ascending = count.sorted(by: { n1, n2 in n1 < n2 })print(descending)print(ascending)

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−


samo polecenie wyraźnie definiuje, że gdy string1 jest większy niż string 2 return true, w przeciwnym razie false, stąd polecenie return jest tutaj pominięte.

znane typy zamknięć

rozważają dodanie dwóch liczb. Wiemy, że addition zwróci typ danych integer. Stąd znane zamknięcia typu są deklarowane jako−

let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

-10

deklarowanie skróconych nazw argumentów jako zamknięć

Swift 4 automatycznie podaje skrócone nazwy argumentów do zamknięć wbudowanych, które mogą być używane do odwoływania się do wartości argumentów zamknięcia nazwami $0, $1, $2 i tak dalej.

var shorthand: (String, String) -> Stringshorthand = {  }print(shorthand("100", "200"))

tutaj, $0 i $1 odnoszą się do pierwszego i drugiego ciągu argumentów zamknięcia.

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−

200

Swift 4 ułatwia użytkownikowi reprezentowanie zamknięć w wierszu jako skróconych nazw argumentów poprzez reprezentowanie $0, $1, $2 — $n.

Closures lista argumentów jest pominięta w sekcji definicja, gdy reprezentujemy skrócone nazwy argumentów wewnątrz wyrażeń zamknięcia. Na podstawie typu funkcji zostaną wyprowadzone skrócone nazwy argumentów. Ponieważ argument skrócony jest zdefiniowany w ciele wyrażenia, słowo kluczowe ” in ” jest pomijane.

zamknięcia jako funkcje operatora

Swift 4 zapewnia łatwy sposób dostępu do elementów, po prostu zapewniając funkcje operatora jako zamknięcia. W poprzednich przykładach słowo kluczowe ’ Bool 'jest używane do zwracania’ true’, gdy łańcuchy są równe, w przeciwnym razie zwraca’false’.

wyrażenie jest jeszcze prostsze przez funkcję operatora w domknięciu jako−

let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−


zamknięcia jako Przyczepy

przekazanie końcowego argumentu funkcji do wyrażenia zamknięcia jest deklarowane za pomocą 'zamknięcia końcowe’. Jest zapisywany poza funkcją () za pomocą {}. Jego zastosowanie jest potrzebne, gdy nie jest możliwe zapisanie funkcji inline w jednej linii.

reversed = sorted(names) {  > }

gdzie {$0 > $1} są reprezentowane jako końcowe zamknięcia zadeklarowane na zewnątrz (nazwy).

import Foundationvar letters = let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString})let stletters = letters.map() { .substringToIndex(advance(.startIndex, 2)).uppercaseString }print(stletters)

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−


Przechwytywanie wartości i typów odniesienia

w Swift 4 przechwytywanie wartości stałych i zmiennych odbywa się za pomocą zamknięć. Dalej odsyła i modyfikuje wartości dla tych stałych i zmiennych wewnątrz ciała zamknięcia, nawet jeśli zmienne już nie istnieją.

Przechwytywanie wartości stałych i zmiennych uzyskuje się za pomocą funkcji zagnieżdżonej poprzez zapis funkcji w ciele innej funkcji.

funkcja zagnieżdżona przechwytuje−

  • zewnętrzne argumenty funkcji.
  • przechwytuje stałe i zmienne zdefiniowane w zewnętrznej funkcji.

w Swift 4, gdy stała lub zmienna jest zadeklarowana wewnątrz funkcji, odwołania do tych zmiennych są również automatycznie tworzone przez zamknięcie. Zapewnia również możliwość odwoływania się do więcej niż dwóch zmiennych jako tego samego zamknięcia w następujący sposób−

let decrem = calcDecrement(forDecrement: 18)decrem()

tutaj zmienne onedecrement i Decrement będą wskazywać ten sam blok pamięci, co odniesienie do zamknięcia.

func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total print(overallDecrement) return overallDecrement } return decrementer}let decrem = calcDecrement(forDecrement: 18)decrem()decrem()decrem()

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−

826446

kiedy za każdym razem wywoływana jest zewnętrzna funkcja calcDecrement, wywołuje ona funkcję decrementer () i zmniejsza wartość o 18 i zwraca wynik za pomocą zewnętrznej funkcji calcDecrement. Tutaj calcDecrement działa jak zamknięcie.

mimo że funkcja decrementer () nie ma żadnych argumentów, domyślnie odwołuje się do zmiennych 'overallDecrement ’ i’ total ’ poprzez przechwycenie jej istniejących wartości. Kopia wartości dla podanych zmiennych jest przechowywana za pomocą nowej funkcji decrementer (). Swift 4 obsługuje funkcje zarządzania pamięcią poprzez alokację i dealokację przestrzeni pamięci, gdy zmienne nie są używane.

ogłoszenia