Un ciclo for più moderno
Fra le proposte per la terza versione di Swift, la prima major release da quando il nuovo linguaggio di Apple è stato reso Open Source, ci sono 2 proposte che lasceranno molti nostalgici come me, con l’amaro in bocca.
Mi riferisco alla proposta già accettata e che verrà introdotta con la versione 3.0, di rimuovere definitivamente la sintassi C-like per i cicli for in favore di una sintassi più moderna.
In breve, ecco come trasformare un classico ciclo for C-like in un ciclo for con una sintassi Swift-like.
// Usiamo un array di 5 elementi come esempio let array = [10,20,30,40,50] // Un ciclo for con sintassi C-like: for (var i=0; i < array.count; i++) { print("array[\(i)] \(array[i])") }
Per trasformare il nostro ciclo in un ciclo Swift-like, possiamo usare il ciclo for-in ed un Range Operator:
// Un ciclo for-in con range operator: for var i in 0..< array.count { print("array[\(i)] \(array[i])") }
La sintassi del ciclo for-in può essere formalizzata in questo modo:
for <nome_variabile> in <nome_array> { ... }
ed il suo uso diventa molto presto naturale, sopratutto quando dobbiamo scorrere un array di oggetti.
Ad ogni iterazione, nome_variabile conterrà l’ i-esimo elemento del nostro array e potremo accedere al suo valore all’interno del nostro ciclo:
// Prendiamo in considerazione un array di stringhe: let names = ["Luca", "Mario", "Riccardo", "Alessandro"] // Usiamo il ciclo for-in per prendere in analisi un nome alla volta: for name in names { print("Ciao \(name)!") }
Nel caso, all’interno del ciclo, dovessimo aver bisogno di conoscere l’indice dell’ elemento corrente, possiamo usare il metodo enumerate() che restituisce una tupla contenente l’indice e l’oggetto:
for (i, name) in names.enumerate() { print("names[\(i)] \(name)!") }
La seconda proposta a cui ho accennato è quasi una conseguenza della prima, quella cioè di rimuovere gli operatori ++ e – – .
Non è la prima volta che in un linguaggio di programmazione moderno, nato dopo il linguaggio C, non si trovano gli operatori di autoincremento e autodecremento; anche Ruby, linguaggio noto soprattutto per la sua sintassi moderna, non prevede per scelta dichiarata gli operatori ++ e – – perchè a causa dei diversi effetti dipendenti dalla loro posizione (pre-incremento e post-incremento) possono causare ambiguità e conseguenti errori.
Swift, che oggi alla versione 2.1.1 prevede questi operatori, potrebbe abbandonarli presto in favore di qualcosa di più esplicito e sicuro.
Per concludere, vi segnalo questo repository su GitHub che contiene una serie di playgrounds in Swift compreso quello relativo agli esempi citati.