Swift-Closures
Le chiusure in Swift 4 sono simili a quelle delle funzioni autonome organizzate come blocchi e chiamate ovunque come i linguaggi C e Objective C. Costanti e riferimenti variabili definiti all’interno delle funzioni vengono acquisiti e memorizzati in chiusure. Le funzioni sono considerate come casi speciali di chiusure e assumono le seguenti tre forme−
Funzioni globali | Funzioni nidificate | Espressioni di chiusura |
---|---|---|
Avere un nome. Non acquisire alcun valore | Avere un nome. Cattura i valori dalla funzione di chiusura | Chiusure senza nome cattura i valori dai blocchi adiacenti |
Le espressioni di chiusura in lingua Swift 4 seguono stili di sintassi nitidi, ottimizzati e leggeri che includono.
- Inferire i tipi di parametro e valore restituito dal contesto.
- Ritorni impliciti da chiusure a espressione singola.
- Abbreviata argomento nomi e
- Finali di chiusura sintassi
Sintassi
di Seguito è una sintassi generica per definire la chiusura, che accetta parametri e restituisce un tipo di dati−
{ (parameters) −> return type in statements}
Seguito è riportato un semplice esempio−
let studname = { print("Welcome to Swift Closures") }studname()
Quando si esegue il programma di cui sopra utilizzando giochi, otteniamo il seguente risultato−
Welcome to Swift Closures
La chiusura accetta due parametri e restituisce un valore Booleano−
{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}
Seguito è riportato un semplice esempio−
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
Quando si esegue il programma di cui sopra utilizzando giochi, si ottiene il seguente risultato−
10
Le espressioni in Closures
Le funzioni nidificate forniscono un modo conveniente di nominare e definire blocchi di codice. Invece di rappresentare l’intera dichiarazione di funzione e i costrutti del nome vengono utilizzati per indicare funzioni più brevi. La rappresentazione della funzione in una chiara dichiarazione breve con sintassi focalizzata è ottenuta attraverso espressioni di chiusura.
Programma Ordine ascendente
Ordinamento di una stringa è ottenuto dalla funzione Swift 4s chiave riservata “ordinati” che è già disponibile nella libreria standard. La funzione ordinerà le stringhe date in ordine crescente e restituisce gli elementi in un nuovo array con la stessa dimensione e tipo di dati menzionati nel vecchio array. Il vecchio array rimane lo stesso.
Due argomenti sono rappresentati all’interno della funzione ordinata−
-
Valori di tipo noto rappresentati come matrici.
-
Contenuto dell’array (Int, Int) e restituisce un valore booleano (Bool) se l’array è ordinato correttamente restituirà il valore true altrimenti restituirà false.
Una funzione normale con stringa di input viene scritta e passata alla funzione ordinata per ottenere le stringhe ordinate in un nuovo array che viene mostrato di seguito−
func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)
Quando eseguiamo sopra il programma usando playground, otteniamo il seguente risultato−
true
L’array iniziale da ordinare per icecream è dato come “Swift 4″e ” great”. La funzione per ordinare l’array è dichiarata come string datatype e il suo tipo di ritorno è menzionato come booleano. Entrambe le stringhe vengono confrontate e ordinate in ordine crescente e memorizzate in un nuovo array. Se l’ordinamento viene eseguito con successo, la funzione restituirà un valore true altrimenti restituirà false.
Sintassi delle espressioni di chiusura−
- parametri costanti,
- parametri variabili e
- parametri inout.
L’espressione di chiusura non supportava i valori predefiniti. I parametri variadici e le tuple possono anche essere usati come tipi di parametro e tipi di ritorno.
let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)
Quando eseguiamo il programma sopra utilizzando playground, otteniamo il seguente risultato−
30
I parametri e le dichiarazioni di tipo restituito menzionati nell’istruzione function possono anche essere rappresentati dalla funzione inline closure expression con la parola chiave ‘in’. Una volta dichiarato parametro e tipi di ritorno ‘in’ parola chiave viene utilizzato per indicare che il corpo della chiusura.
Rendimenti impliciti a espressione singola
Qui, il tipo di funzione del secondo argomento della funzione ordinata chiarisce che un valore Bool deve essere restituito dalla chiusura. Poiché il corpo della chiusura contiene una singola espressione (s1 > s2) che restituisce un valore Bool, non vi è alcuna ambiguità e la parola chiave return può essere omessa.
Per restituire una singola dichiarazione di espressione nelle chiusure di espressioni, la parola chiave ‘return’ viene omessa nella sua parte di dichiarazione.
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)
Quando eseguiamo il programma sopra utilizzando playground, otteniamo il seguente risultato−
L’istruzione stessa definisce chiaramente che quando string1 è maggiore della stringa 2 restituisce true altrimenti false, quindi l’istruzione return viene omessa qui.
Chiusure di tipo noto
Considerare l’aggiunta di due numeri. Sappiamo che l’aggiunta restituirà il tipo di dati intero. Quindi noto il tipo di chiusure sono dichiarate come−
let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)
Quando si esegue il programma di cui sopra utilizzando giochi, otteniamo il seguente risultato−
-10
Dichiarazione di Stenografia Argomento Nomi come Chiusure
Swift 4 fornisce automaticamente abbreviata argomento nomi inline chiusure, che può essere utilizzato per fare riferimento ai valori di chiusura di argomenti con i nomi di $0, $1, $2, e così via.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
Qui, $0 e $1 si riferiscono agli argomenti della prima e della seconda stringa della chiusura.
Quando si esegue il programma di cui sopra utilizzando giochi, otteniamo il seguente risultato−
200
Swift 4 facilita l’utente per rappresentare Inline chiusure come scorciatoia argomento nomi che rappresentano $0, $1, $2 — $n.
Chiusure elenco di argomento viene omesso nella sezione definizione nel rappresentare abbreviata argomento nomi in chiusura espressioni. In base al tipo di funzione verranno derivati i nomi degli argomenti abbreviati. Poiché l’argomento stenografico è definito nel corpo dell’espressione, la parola chiave’ in ‘ viene omessa.
Chiusure come funzioni operatore
Swift 4 fornisce un modo semplice per accedere ai membri semplicemente fornendo funzioni operatore come chiusure. Negli esempi precedenti la parola chiave ‘ Bool ‘viene utilizzata per restituire’ true ‘quando le stringhe sono uguali altrimenti restituisce’false’.
L’espressione è resa ancora più semplice dalla funzione operatore in chiusura come−
let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)
Quando eseguiamo il programma sopra usando playground, otteniamo il seguente risultato−
Chiusure come rimorchi
Il passaggio dell’argomento finale della funzione a un’espressione di chiusura viene dichiarato con l’aiuto di “Chiusure finali”. È scritto al di fuori della funzione () con {}. Il suo utilizzo è necessario quando non è possibile scrivere la funzione in linea su una singola riga.
reversed = sorted(names) { > }
dove {0 0 >} 1} sono rappresentati come chiusure finali dichiarate all’esterno (nomi).
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)
Quando eseguiamo il programma sopra utilizzando playground, otteniamo il seguente risultato−
Acquisizione di valori e tipi di riferimento
In Swift 4, l’acquisizione di valori costanti e variabili viene eseguita con l’aiuto delle chiusure. Fa inoltre riferimento e modifica i valori per quelle costanti e variabili all’interno del corpo di chiusura anche se le variabili non esistono più.
L’acquisizione di valori costanti e variabili viene ottenuta utilizzando la funzione nidificata scrivendo la funzione nel corpo di un’altra funzione.
Una funzione nidificata cattura−
- Argomenti della funzione esterna.
- Cattura costanti e variabili definite all’interno della funzione Esterna.
In Swift 4, quando una costante o una variabile viene dichiarata all’interno di una funzione, il riferimento a tali variabili viene creato automaticamente dalla chiusura. Fornisce inoltre la possibilità di riferirsi a più di due variabili come la stessa chiusura come segue−
let decrem = calcDecrement(forDecrement: 18)decrem()
Qui le variabili oneDecrement e Decrement punteranno entrambi lo stesso blocco di memoria come riferimento di chiusura.
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()
Quando eseguiamo il programma sopra utilizzando playground, otteniamo il seguente risultato−
826446
Quando ogni volta che viene chiamata la funzione esterna calcDecrement, richiama la funzione decrementer () e decrementa il valore di 18 e restituisce il risultato con l’aiuto della funzione esterna calcDecrement. Qui calcDecrement agisce come una chiusura.
Anche se la funzione decrementer () non ha argomenti di chiusura per impostazione predefinita si riferisce alle variabili ‘overallDecrement’ e ‘total’ catturando i suoi valori esistenti. La copia dei valori per le variabili specificate viene memorizzata con la nuova funzione decrementer (). Swift 4 gestisce le funzioni di gestione della memoria allocando e deallocando gli spazi di memoria quando le variabili non sono in uso.