Qualcosa di speciale
Swift ha le caratteristiche di un linguaggio moderno. Per esempio la sintassi snella, che sta a metà fra linguaggi tradizionali e i linguaggi di scripting, grazie punti e virgola opzionali (come in JavaScript) e grazie a un meccanismo automatico di inferenza dei tipi, che permette di omettere quasi ovunque una dichiarazione specifica nella definizione delle variabili. Swift ha i generics e strutture dati ricche e espressive. Insomma, una discreta eredità da linguaggi funzionali come OcaML.
Ci sono variabili immutabili, funzioni e altre caratteristiche dei linguaggi funzionali che hanno dato eccellente prova di sé nella programmazione concorrente.
Al di là di trovare somiglianze, però, domandiamoci dove stanno quelle due o tre caratteristiche che danno personalità a un linguaggio.
Al primo posto, secondo noi, sta Arc, Automatic Reference Counting, l’infrastruttura che usa da qualche tempo Objective-C per tenere traccia delle allocazioni di memoria e rilasciare automaticamente le variabili quando hanno finito il loro ciclo di vita. Si tratta di una caratteristica importante, su cui il team che ha sviluppato Objective-C ha puntato quando ancora nessuno aveva ancora sentito parlare di Swift. Si tratta di una scelta orgogliosa e coraggiosa, ora che tutti scelgono la strada della garbage collection, e che mette Swift su un piano diverso dagli altri linguaggi. L’allocazione di memoria precisa e sicura senza il carico della garbage collection significa che Swift è adatto per applicazioni in tempo reale.
Un’altra caratteristica che emerge, sono le variabili optional. Swift consente di esprimere in modo chiaro al compilatore e a chi legge il codice dopo di noi, che alcune variabili possono essere eventualmente non inizializzate, anche dove vengono usate.
Facciamo un esempio:
var optionalString: String? = "Hello"
optionalString == nil
Le variabili optional permettono l’uso dell’if nell’assegnazione, un modo espressivo di subordinare il codice al successo nel leggere il valore di una variabile, che permette eventualmente di specificare cosa fare se la variabile è nil
var optionalName: String? = "Michele Costabile"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
Un altro elemento sintattico caratteristico è l’optional chaining, l’indicazione della possibilità di trovare un puntatore non inizializzato in una catena di dereferenziazioni. Per spiegarci, ecco un esempio
if let cardNumber = john.bankAccount?.creditCard?.number {
println("il numero di carta di credito di John è \(cardNumber).")
} else {
println("John non ha un conto o, se lo ha, non ha una carta di credito.")
}
Richiediamo il numero di carta di credito associato al conto corrente di un utente, senza prenderci impegni sul fatto che il conto esista e, se esiste, che ci sia associata una carta di credito. Si tratta di una caratteristica che ci piace un sacco, perché mette al primo posto l’espressione dell’intenzione del codice, mettendo fra le righe i necessari controlli di congruenza, che sono inseriti automaticamente dal compilatore. In questo modo, possiamo scrivere codice che non rischia di generare un errore per un puntatore nullo, e conservare l’espressività che viene dal mettere al primo posto, nella riga uno, l’intenzione di navigare da un oggetto utente, attraverso un conto bancario e una carta di credito, fino al numero di carta. Un plus che arriva insieme a Swift sono i Playground, una visualizzazione offerta da XCode del codice in azione, che permette, per esempio, di seguire l’evoluzione di una variabile nel corso di un ciclo di elaborazione, navigando avanti e indietro nell’esecuzione del programma, sia riga per riga, sia nella timeline. Si tratta di uno strumento didattico eccellente, ottimo per insegnare a programmare o per vedere in pratica l’azione di costrutti poco familiari.
Evoluzione futura
Non c’è ragione di aver paura che Objective-C scompaia improvvisamente: il framework applicativo di Apple resta interamente in Objective-C, così come enormi quantità di codice pubblico in rete. Il vecchio linguaggio resta ancora l’unico strumento per importare codice C++ in un progetto e avere accesso a tutto le sorgenti libere, general purpose, che si trovano sul web. In una parola, il codice e le competenze Objective-C resteranno importanti per parecchi anni a venire e il linguaggio non scomparirà senza preavviso, come i frame in acciaio spazzolato. Per contro, è indiscutibile che i giorni di Objective-C siano contati. Swift non nasce per affiancarsi al vecchio linguaggio, ma per sostituirlo e, prima o poi, lo farà . Quando sarà finito il ciclo di beta test, sarà opportuno iniziare a sperimentare con componenti nel nuovo linguaggio anche in progetti esistenti, dato che la convivenza è garantita.
Chi si accosta alla programmazione iOS adesso, troverà opportuno prendere le cose dalla parte del nuovo. Swift è più coeso e coerente di Objective-C. Purtroppo, non sarà possibile ignorare totalmente il linguaggio in cui è scritto il corpo del sistema e delle sue librerie applicative, ma è più intuitivo prendere questa strada che fare il giro nel verso opposto.
Swift non assomiglia molto a Objective-C, ma le sue interfacce con il framework sono comunque progettate in modo da calarsi nel modo più naturale su Cocoa, quindi le similitudini sono ben visibili. Per fare un esempio, ecco un frammento Objective-C
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
ed ecco come si mappa in Swift:
let myTableView: UITableView = UITableView(frame: CGRectZero, style:.Grouped)
L’architettura di Cocoa è stata un invitato importante al tavolo di progetto di Swift. Secondo alcuni questo è un difetto architetturale, perché la progettazione dovrebbe partire da principi primi e cercare l’innovazione, come è avvenuto con il linguaggio Go.
Noi la vediamo diversamente: il framework ha avuto la libertà di evolvere e maturare in modo autonomo dal linguaggio e la sua organizzazione può portare ordine, più che limitare la creatività .
Michele Costabile