Swift - Chiusure

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 catturati e memorizzati nelle chiusure. Le funzioni sono considerate casi speciali di chiusure e assumono le tre forme seguenti:

Funzioni globali Funzioni annidate Espressioni di chiusura
Avere un nome. Non acquisire alcun valore Avere un nome. Cattura i valori dalla funzione che racchiude Le chiusure senza nome acquisiscono i valori dai blocchi adiacenti

Le espressioni di chiusura nel linguaggio Swift 4 seguono stili di sintassi nitidi, ottimizzati e leggeri che includono.

  • Deduzione di tipi di parametri e valori restituiti dal contesto.
  • Ritorni impliciti da chiusure a espressione singola.
  • Nomi di argomenti abbreviati e
  • Sintassi di chiusura finale

Sintassi

Di seguito è riportata una sintassi generica per definire la chiusura che accetta parametri e restituisce un tipo di dati -

{
   (parameters) −> return type in
   statements
}

Di seguito è riportato un semplice esempio:

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

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

Welcome to Swift Closures

La chiusura seguente accetta due parametri e restituisce un valore Bool -

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

Di seguito è riportato un semplice esempio:

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

let result = divide(200, 20)
print (result)

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

10

Espressioni nelle chiusure

Le funzioni annidate forniscono un modo conveniente per denominare e definire blocchi di codice. Invece di rappresentare l'intera dichiarazione di funzione e i costrutti del nome vengono utilizzati per denotare funzioni più brevi. La rappresentazione della funzione in una breve dichiarazione chiara con sintassi focalizzata si ottiene tramite espressioni di chiusura.

Programma di ordine crescente

L'ordinamento di una stringa è ottenuto dalla funzione riservata "ordinato" del tasto Swift 4s che è già disponibile nella libreria standard. La funzione ordinerà le stringhe date in ordine crescente e restituirà 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.

  • Il contenuto dell'array (Int, Int) e restituisce un valore booleano (Bool) se l'array è ordinato correttamente restituirà un valore true, altrimenti restituirà false.

Una normale funzione con una stringa di input viene scritta e passata alla funzione ordinata per ottenere le stringhe ordinate nel nuovo array che è 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 il programma sopra utilizzando playground, otteniamo il seguente risultato:

true

L'array iniziale da ordinare per il gelato è "Swift 4" e "great". La funzione per ordinare l'array è dichiarata come tipo di dati stringa e il suo tipo restituito è indicato come Boolean. Entrambe le stringhe vengono confrontate e ordinate in ordine crescente e memorizzate in un nuovo array. Se l'ordinamento viene eseguito correttamente, la funzione restituirà un valore true, altrimenti restituirà false.

Usi della sintassi delle espressioni di chiusura:

  • parametri costanti,
  • parametri variabili e
  • parametri inout.

L'espressione di chiusura non supportava i valori predefiniti. I parametri variabili e le tuple possono essere utilizzati anche come tipi di parametro e tipi restituiti.

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

let digits = sum(10, 20)
print(digits)

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

30

I parametri e le dichiarazioni del tipo restituito menzionati nell'istruzione della funzione possono anche essere rappresentati dalla funzione di espressione di chiusura inline con la parola chiave 'in'. Una volta dichiarati parametri e tipi restituiti, la parola chiave 'in' viene utilizzata per indicare il corpo della chiusura.

Restituzioni implicite a espressione singola

Qui, il tipo di funzione del secondo argomento della funzione ordinata rende chiaro 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 è ambiguità e la parola chiave return può essere omessa.

Per restituire un'istruzione di espressione singola nelle chiusure dell'espressione, la parola chiave 'return' viene omessa nella sua parte di dichiarazione.

var count:[Int] = [5, 10, -6, 75, 20]
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 precedente usando playground, otteniamo il seguente risultato:

[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]

L'istruzione stessa definisce chiaramente che quando stringa1 è maggiore di stringa 2 restituisce true altrimenti false, quindi l'istruzione return viene omessa qui.

Chiusure di tipo noto

Considera l'aggiunta di due numeri. Sappiamo che l'aggiunta restituirà il tipo di dati intero. Quindi le chiusure di tipo noto sono dichiarate come:

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

let digits = sub(10, 20)
print(digits)

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

-10

Dichiarazione di nomi di argomenti stenografici come chiusure

Swift 4 fornisce automaticamente nomi di argomenti abbreviati alle chiusure inline, che possono essere utilizzati per fare riferimento ai valori degli argomenti della chiusura con i nomi $ 0, $ 1, $ 2 e così via.

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

Qui $ 0 e $ 1 si riferiscono al primo e al secondo argomento String della chiusura.

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

200

Swift 4 consente all'utente di rappresentare le chiusure in linea come nomi di argomenti abbreviati rappresentando $ 0, $ 1, $ 2 --- $ n.

L'elenco degli argomenti delle chiusure viene omesso nella sezione delle definizioni quando rappresentiamo i nomi degli argomenti abbreviati all'interno delle espressioni di chiusura. In base al tipo di funzione verranno derivati ​​i nomi abbreviati degli argomenti. Poiché l'argomento abbreviato è definito nel corpo dell'espressione, la parola chiave "in" viene omessa.

Chiusure come funzioni dell'operatore

Swift 4 fornisce un modo semplice per accedere ai membri fornendo semplicemente le funzioni dell'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 = [98, -20, -30, 42, 18, 35]
var sortedNumbers = numb.sorted ({
   (left: Int, right: Int) -> Bool in
   return left < right
})

let asc = numb.sorted(<)
print(asc)

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

[-30, -20, 18, 35, 42, 98]

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 inline su una singola riga.

reversed = sorted(names) { $0 > $1}

dove {$ 0> $ 1} sono rappresentati come chiusure finali dichiarate all'esterno di (nomi).

import Foundation
var letters = ["North", "East", "West", "South"]

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

let stletters = letters.map() { 
   $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString 
}
print(stletters)

Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:

[NO, EA, WE, SO]

Acquisizione di valori e tipi di riferimento

In Swift 4, l'acquisizione di costanti e valori delle 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 si ottiene utilizzando la funzione annidata scrivendo funzione con nel corpo di un'altra funzione.

Una funzione annidata acquisisce -

  • Argomenti della funzione esterna.
  • Cattura le costanti e le variabili definite all'interno della funzione Outer.

In Swift 4, quando una costante o una variabile viene dichiarata all'interno di una funzione, anche i riferimenti a tali variabili vengono creati automaticamente dalla chiusura. Fornisce inoltre la possibilità di riferire più di due variabili alla stessa chiusura come segue:

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

Qui oneDecrement e le variabili Decrement indicheranno entrambe 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 precedente usando playground, otteniamo il seguente risultato:

82
64
46

Ogni volta che viene chiamata la funzione esterna calcDecrement, essa richiama la funzione decrementer () e decrementa il valore di 18 e restituisce il risultato con l'aiuto della funzione esterna calcDecrement. Qui calcDecrement funge da chiusura.

Anche se la funzione decrementer () non ha argomenti, la chiusura di default si riferisce alle variabili 'overallDecrement' e 'total' catturandone i 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.