Swift-închideri
închiderile din Swift 4 sunt similare cu cele ale funcțiilor autonome organizate ca blocuri și numite oriunde, cum ar fi limbile C și Objective C. Constante și referințe variabile definite în interiorul funcțiilor sunt capturate și stocate în închideri. Funcțiile sunt considerate ca fiind cazuri speciale de închidere și este nevoie de următoarele trei forme−
funcții globale | funcții imbricate | expresii de închidere |
---|---|---|
ai un nume. Nu capturați nicio valoare | care să aibă un nume. Capturați valori din funcția de închidere | închideri anonime capturați valori din blocurile adiacente |
expresii de închidere în Swift 4 Limba urmați clare, optimizare, și stiluri de sintaxă ușoare, care include.
- deducerea parametrilor și a tipurilor de valori returnate din context.
- returnări implicite din închideri cu o singură expresie.
- numele argumentelor prescurtate și
- sintaxa închiderii la sfârșit
sintaxa
următoarea este o sintaxă generică pentru a defini Închiderea care acceptă parametrii și returnează un tip de date−
{ (parameters) −> return type in statements}
în urma este un exemplu simplu−
let studname = { print("Welcome to Swift Closures") }studname()
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
Welcome to Swift Closures
următoarea închidere acceptă doi parametri și returnează o valoare Bool−
{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}
în urma este un exemplu simplu−
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
10
expresii în închideri
funcții imbricate oferă un mod convenabil de denumire și definirea blocuri de cod. În loc să reprezinte întreaga declarație de funcții și construcțiile de nume sunt utilizate pentru a desemna funcții mai scurte. Reprezentarea funcției într-o scurtă declarație clară cu sintaxă focalizată se realizează prin expresii de închidere.
program de ordine crescătoare
sortarea unui șir este realizată prin funcția rezervată a tastei Swift 4S „sortată”, care este deja disponibilă în biblioteca standard. Funcția va sorta șirurile date în ordine crescătoare și returnează elementele într-o nouă matrice cu aceeași dimensiune și tip de date menționate în vechea matrice. Vechea matrice rămâne aceeași.
două argumente sunt reprezentate în interiorul funcției sortate−
-
valori de tip cunoscut reprezentate ca matrice.
-
Array cuprins (Int, Int) și returnează o valoare Boolean (Bool) în cazul în care matrice este sortat în mod corespunzător se va întoarce true value altfel se va întoarce false.
o funcție normală cu șir de intrare este scrisă și transmisă funcției sortate pentru a obține șirurile sortate în matrice nouă, care este prezentată mai jos−
func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
true
matricea inițială care trebuie sortată pentru înghețată este dată ca „Swift 4″și ” grozav”. Funcția de sortare a matricei este declarată ca tip de date string și tipul său de returnare este menționat ca Boolean. Ambele șiruri sunt comparate și sortate în ordine crescătoare și stocate într-o nouă matrice. Dacă sortarea este efectuată cu succes, funcția va returna o valoare adevărată, altfel va reveni fals.
sintaxa expresiei de închidere folosește−
- parametri constanți,
- parametri variabili și
- parametri inout.
expresia de închidere nu a acceptat valorile implicite. Parametrii variadici și Tuplurile pot fi, de asemenea, utilizate ca tipuri de parametri și tipuri de retur.
let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
30
parametrii si declaratiile de tip retur mentionate in Declaratia function pot fi de asemenea reprezentate de functia inline closure expression cu cuvantul cheie ‘in’. Odată ce ați declarat parametrul și tipurile de returnare ‘ în ‘ cuvântul cheie este utilizat pentru a indica faptul că corpul închiderii.
o singură expresie implicită returnează
aici, tipul de funcție al celui de-al doilea argument al funcției sortate arată clar că o valoare Bool trebuie returnată prin închidere. Deoarece corpul închiderii conține o singură expresie (S1 > s2) care returnează o valoare Bool, nu există ambiguitate, iar cuvântul cheie return poate fi omis.
pentru a returna o singură declarație de Expresie în închiderea expresiei cuvântul cheie ‘return’ este omis în partea sa de declarație.
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)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
declarația în sine definește în mod clar că, atunci când string1 este mai mare decât string 2 return true altfel false, prin urmare, declarația de returnare este omisă aici.
închideri de tip cunoscut
luați în considerare adăugarea a două numere. Știm că adăugarea va returna tipul de date întreg. Prin urmare, închiderile de tip cunoscute sunt declarate ca−
let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
-10
declararea numelor argumentelor prescurtate ca închideri
Swift 4 oferă automat numele argumentelor prescurtate închiderilor inline, care pot fi folosite pentru a se referi la valorile argumentelor închiderii prin numele $0, $1, $2 și așa mai departe.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
aici, $0 și $1 se referă la primul și al doilea șir de argumente de închidere.
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
200
Swift 4 facilitează utilizatorului să reprezinte închiderile Inline ca nume de argumente prescurtate prin reprezentarea $0, $1, $2 — $n.
lista argumentelor închiderilor este omisă în secțiunea definiție atunci când reprezentăm numele argumentelor prescurtate în expresiile de închidere. Pe baza tipului de funcție, numele argumentelor prescurtate vor fi derivate. Deoarece argumentul prescurtare este definit în corpul de Expresie cuvântul cheie’ in ‘ este omis.
închideri ca funcții de Operator
Swift 4 oferă o modalitate ușoară de a accesa membrii oferind doar funcții de operator ca închideri. În exemplele anterioare, cuvântul cheie ‘ Bool ‘este folosit pentru a returna fie’ true ‘atunci când șirurile sunt egale, altfel returnează’false’.
expresia se face chiar mai simplu de funcția operatorului în Închidere ca−
let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
închiderile ca remorci
trecerea argumentului final al funcției la o expresie de închidere este declarată cu ajutorul ‘închiderilor finale’. Este scris în afara funcției () cu {}. Utilizarea sa este necesară atunci când nu este posibilă scrierea funcției în linie pe o singură linie.
reversed = sorted(names) { > }
unde {$0 > $1} sunt reprezentate ca închideri finale declarate în afara (nume).
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)
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
captarea valorilor și a tipurilor de referință
în Swift 4, captarea constantelor și a valorilor variabilelor se face cu ajutorul închiderilor. Se referă în continuare și modifica valorile pentru aceste constante și variabile în interiorul corpului de închidere, chiar dacă variabilele nu mai există.
captarea valorilor constante și variabile se realizează prin utilizarea funcției imbricate prin scrierea funcției cu în corpul altei funcții.
o funcție imbricată captează−
- argumentele funcției exterioare.
- capturați constante și variabile definite în cadrul funcției exterioare.
în Swift 4, atunci când o constantă sau o variabilă este declarată în interiorul unei funcții, referința la acele variabile sunt, de asemenea, create automat de închidere. De asemenea, oferă facilitatea de a referi mai mult de două variabile ca aceeași închidere, după cum urmează−
let decrem = calcDecrement(forDecrement: 18)decrem()
aici variabilele oneDecrement și Decrement vor indica ambele același bloc de memorie ca referință de închidere.
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()
când rulăm programul de mai sus folosind playground, obținem următorul rezultat−
826446
când de fiecare dată când se numește funcția exterioară calcDecrement, aceasta invocă funcția decrementer () și scade valoarea cu 18 și returnează rezultatul cu ajutorul funcției exterioare calcDecrement. Aici calcDecrement acționează ca o închidere.
chiar dacă funcția decrementer() nu are argumente închiderea implicită se referă la variabilele ‘overallDecrement’ și ‘total’ prin captarea valorilor sale existente. Copia valorilor pentru variabilele specificate sunt stocate cu noua funcție decrementer (). Swift 4 gestionează funcțiile de gestionare a memoriei prin alocarea și Alocarea spațiilor de memorie atunci când variabilele nu sunt utilizate.