Swift @autoclosure

it Dichiariamo in swift una funzione che prende come parametro una stringa e una closure:

Come si vede la closure (getPrefix) è usata internamente per ottenere il prefisso da inserire prima della stampa della stringa.

Per chiamare questa funzione usiamo il seguente codice:

Nella closure la dichiarazione dei parametri e del tipo di ritorno possono essere automaticamente desunte dal prototipo di printWithPrefix, quindi possiamo ometterle e ottenere lo stesso risultato usando:

Inoltre se la closure consiste di una sola espressione (come nel nostro caso) il risultato della espressione viene automaticamente usato come valore di ritorno, quindi riduciamo ancora:

Notiamo che la printWithPrefix si presta anche ad essere usata in casi più complessi in cui il prefisso è calcolato dinamicamente (in questo esempio notiamo anche la variabile text “catturata” dallo scope superiore):

Ma torniamo all’esempio più semplice:

Qui entra in scena l’ @auto_closure. Questo attributo, inserito nella dichiarazione di un parametro closure di una funzione, ci permette di chiamare la funzione stessa omettendo le graffe intorno al codice stesso, cioè la funzione:

può essere chiamata nel seguente modo:

In pratica è stato eseguito un auto-closure: l’attributo @auto_closure aggiunto davanti al tipo della closure nella dichiarazione ha indicato al sistema di aggiungere implicitamente le graffe ({}) intorno a quel parametro quando la funzione viene chiamata.

L’@auto_closure è valido solo per closure che non prevedono parametri passati ( () -> [TipoRitorno] ).

Inoltre se un parametro è dichiarato @auto_closure non può essere chiamato aggiungendo le graffe in modo esplicito:

Se voglio inserire closure complesse in parametri auto_closure quindi, non potendo inserire esplicitamente le graffe, posso dichiarare una closure separata e poi passarla alla funzione, come in:

Il codice di esempio lo trovate su github: Autoclosure.playground.

Swift @auto_closure

Valerio Ferrucci

Valerio Ferrucci (valfer) develops software on Apple Macintosh since the 1990s until today for MacOS, OSX and, since some years, iOS. He is also a Web (PHP/MySQL/JS/CSS) and Android Developer.

More Posts - Website

Follow Me:
TwitterFacebookLinkedIn

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Leave a Reply

Your email address will not be published. Required fields are marked *