Functions, Closures Flashcards
Functions
Le funzioni sono blocchi autonomi di codice che eseguono un’attività specifica. Nominano una funzione in modo che identifichi ciò che fa e quindi utilizza il nome per chiamare la funzione ed eseguire la sua attività quando necessario.
In Swift, ogni funzione ha un type che contiene i tipi di parametri della funzione e il tipo di ritorno.
Questo tipo può essere utilizzato come qualsiasi altro tipo in Swift e questo rende più facile il passaggio delle funzioni come i parametri ad altre funzioni e la restituzione delle funzioni di ritorno dalle funzioni.
Le funzioni possono anche essere scritte in altre funzioni per incapsulare funzionalità utili all’interno di un ambito di funzioni nidificate.
Defining and Calling Functions
Quando si definisce una funzione, è possibile definire uno o più valori nominati e tipizzati che la funzione esegue come input (parametri) e/o un tipo di valore che la funzione passa come output (type di ritorno).
Per utilizzare una funzione, chiamarla usando il suo nome e passare a esso valori di input (argomenti) che corrispondono ai tipi di parametri della funzione. Gli argomenti devono sempre essere forniti nello stesso ordine come nell’elenco dei parametri della funzione.
L’esempio seguente definisce una funzione sayHello, che prende una String (personName) come parametro e restituisce un’altra String:
func sayHello(personName: String) -> String {<br></br>let greeting = “Hello, “ + personName + “!”<br></br>return greeting<br></br>}
La definizione della funzione inizia con la parola chiave func. La parola chiave viene seguita con una freccia di ritorno -> che indica il tipo di ritorno della funzione e il nome del tipo da restituire termina la definizione. L’istruzione di ritorno indica il valore da restituire dalla funzione. Una volta definita la funzione, può essere chiamata in altre parti del codice.
print(sayHello(“David”))
È possibile chiamare la funzione definita più volte e con diversi valori di input.
Multiple Input Parameters
È possibile scrivere più parametri di ingresso all’interno delle parentesi della funzione. Utilizzare le virgole per separare i parametri. Questa funzione richiede un indice di inizio (start) e un indice finale (end) per un intervallo semiaperto e processa gli elementi contenuti nell’intervallo.
func rangeLength(start: Int, end: Int) -> Int {<br></br>return end - start<br></br>}<br></br>print(rangeLength(start: 2, end: 7))<br></br>// prints “5”
Quando si chiama una funzione con più di un parametro, qualsiasi argomento dopo il primo viene etichettato in base al relativo nome del parametro.
Functions Without Parameters
Non è necessario definire i parametri di ingresso all’interno di una funzione. È possibile avere una funzione senza parametri di ingresso. Questa funzione restituirà lo stesso messaggio String ogni volta che verrà chiamato:
func sayHelloWorld() -> String {<br></br>return “Hello, world”<br></br>}
La definizione di funzione richiede ancora parentesi dopo il nome della funzione, anche se non ci sono parametri. Le parentesi che seguono il nome della funzione sono semplicemente vuote quando viene chiamata la funzione.
Functions Without Return Values
Quando si definisce una funzione, non è obbligatorio definire un tipo di ritorno. Nell’esempio che segue, la funzione sayHi () stampa il proprio valore String piuttosto che restituirlo.
func sayHi(name: String) {<br></br>print(“Hi, (name)!”)<br></br>}<br></br>sayHi(“Dave”)<br></br>// prints “Hi, Dave!”
Poiché non è necessario restituire un valore, la definizione della funzione non include la freccia di ritorno (->) o un tipo di ritorno.
La funzione sayHi () restituisce ancora un valore, anche se non dispone di un valore di ritorno definito. Le funzioni senza un tipo di ritorno definito restituiscono un valore speciale del tipo Void. I valori di ritorno possono essere ignorati, ma una funzione che dichiara che restituirà un valore, deve sempre farlo.
Multiple Return Values
È possibile utilizzare un tipo di tuple come tipo di ritorno in modod che una funzione restituisca più valori come parte di un valore di ritorno composto.
L’esempio seguente definisce una funzione che restituisce i numeri più piccoli e più grandi in una array di valori Int:
func minMax(array: [Int]) -> (min: Int, max: Int) {<br></br>var currMin = array[0]<br></br>var currMax = array[0]<br></br>for value in array[1.. if value < currMin {<br></br>currMin = value<br></br>} else if value > currMax {<br></br>currMax = value<br></br>}<br></br>}<br></br>return (currMin, currMax)<br></br>}
La funzione minMax restituisce una tupla contenente due valori Int. I valori sono etichettati min e max, per facilitare l’accesso quando si interroga il valore di ritorno della funzione.
Poiché i valori dei membri del tuple sono denominati come parte del tipo di ritorno della funzione, è possibile accedervi utilizzando la sintassi del punto per recuperare i valori trovati minimi e massimi:
let bounds = minMax([4, -4, 1, 88, 7, 42])<br></br>print(“min is (bounds.min) and max is (bounds.max)”)<br></br>// prints “min is -4 and max is 88”
Non è necessario nominare i membri della tuple quando la tupla viene restituita dalla funzione, perché i loro nomi sono già stati specificati come parte del tipo di ritorno della funzione.
External Parameter Names
I parametri delle funzioni hanno sia un nome di parametro esterno che un nome di parametro locale. Il nome del parametro esterno viene utilizzato per etichettare argomenti passati alla chiamata di una funzione, mentre viene utilizzato un nome di parametro locale quando la funzione viene implementata.
Per impostazione predefinita, il primo parametro omette il suo nome esterno e il secondo e i seguenti parametri usano il loro nome locale come nome esterno. Ogni parametro deve avere il proprio nome locale univoco. I parametri esterni possono essere condivisi.
Un nome di parametro esterno appare appena prima del nome del parametro locale che supporta. I due nomi dei parametri sono separati da uno spazio:
func someFunc(externalName localName: Int) {<br></br>// function can use localName<br></br>}
Ecco una versione della funzione sayHello () che prende i nomi di due persone e restituisce un saluto per entrambi:
func sayHello(to p1: String, and p2: String) -> String {<br></br>return “Hello (p1) and (p2)!”<br></br>}<br></br>print(sayHello(to: “Tom”, and: “Jerry”))<br></br>// prints “Hello Tom and Jerry!”
Le parole to e and sono i nomi dei parametri esterni, utilizzati quando viene chiamata la funzione. L’utilizzo di nomi di parametri esterni può consentire a una funzione di essere chiamata in modo espressivo, come una frase, e ancora produrre un corpo di funzione leggibile e chiaro.
Se si fornisce un nome di parametro esterno per un determinato parametro, tale nome esterno deve essere utilizzato ogni volta che viene chiamata la funzione.