9 motivi per scegliere Swift e non Objective-C

12 settembre 2018

Se vogliamo sviluppare un’app per iOS, il primo problema è scegliere il linguaggio di programmazione con cui realizzarla. In questo articolo vedremo perchè il più moderno Swift può rivelarsi una scelta di più alto livello rispetto al più classico Objective-C.

Swift e Objective-C

Swift è un linguaggio di programmazione object-oriented per sistemi macOS, iOS, watchOS, tvOS e Linux, concepito per coesistere con il linguaggio Objective-C, tipico degli sviluppi per i sistemi operativi Apple. Swift è stato progettato per essere più resiliente agli errori nel codice, ma permette l’uso di codice Objective C, Objective C++ e Swift in un singolo programma. Secondo Wikipedia, Swift è circa 8 volte più veloce di Python e quasi 3 volte più veloce di Objective C per alcuni tipi di algoritmi.

Di contro, Objective-C è un linguaggio di programmazione riflessivo orientato agli oggetti, nato come estensione a oggetti del linguaggio C. Esso mantiene la completa compatibilità col C (a differenza di quanto avviene, per esempio, nel caso del C++). Tra l’altro, anche a causa di questa compatibilità, Objective C non è dotato di forte tipizzazione (caratteristica che invece esibiscono, tra gli altri, sia C++ che Java).

Su HTML.it abbiamo già affrontato entrambi i linguaggi di programmazione in 2 ottime guide, la cui lettura è consigliata: la guida al linguaggio Swift e quella ad Objective-C.

Vediamo dunque quali sono le 9 motivazioni per cui Swift risulta essere una scelta superiore a Objective-C.

Maggiore leggibilità del codice

Dato che Objective-C è costruito a partire da C, molte caratteristiche "negative" di quest’ultimo sono inevitabilmente ereditate dal primo. Mentre Objective-C impone l’utilizzo dei simboli @ per differenziare le keyword ed i tipi da quelli di C, Swift permette di rimuovere i suddetti simboli in presenza di tutti i tipi Objective-C o le keyword legate agli oggetti. Inoltre, non abbiamo bisogno dei ";" per terminare le righe di codice, ne le parentesi per avviluppare i codici posti tra gli operatori condizionali if/else. Il codice di Swift ricorda l’inglese nativo, come molti altri linguaggio di programmazione. Gli sviluppatori Javascript, Java, Pythin, C e C++ troveranno Swift più "vicino" alle loro abitudini.

Migliore manutenibilità

Il legame con C causa la seguente condizione: se C non evolve, Objective-C non evolve. Ad esempio, C richiede che lo sviluppatore debba mantenere 2 file di codice differenti per migliorare i tempi di compilazione e l’efficienza della creazione dell’eseguibile, e lo stesso requisito non fa eccezione in Objective-C. Swift elimina la necessità del mantenimento del doppio file, tramite Xcode e il compilatore LLVM. La necessità di separare il file header dal file di implementazione (body) sparisce con Swift. Quest’ultimo combina il file header di Objective-C (.h) e il file di implementazione (.m) in un unico file (.swift). Il sistema di Objective-C impone un lavoro addizionale che grava sulle spalle dello sviluppatore, che ad esempio dovrà sincronizzare i nomi dei metodi e i commenti tra i file in modo manuale. Se il team di sviluppo non segue una convezione standard, il risultato può essere difficilmente manutenibile. Xcode e il compilatore LLMV lavorano dietro le quinte per ridurre il carico di lavoro del programmatore.

Maggiore sicurezza

Un aspetto particolare di Objective-C è la modalità in cui vengono gestiti i puntatori (in particolare i puntatori “nil”). In Objective-C, se un metodo viene richiamato con una variabile puntatore non inizializzata (nil), non viene generato alcun crash dell’applicazione. La linea di codice che contiene questa espressione diventa automaticamente una non-operazione (no-op), e anche se in apparenza potrebbe sembrare benefico il fatto che l’applicazione non subisca un crash, questa caratteristica è stata la causa di una grande quantità di bug. Le no-op portano a comportamenti inaspettati nell’applicazione, il che rappresenta un grosso svantaggio per gli sviluppatori che tentano di sistemare un crash random o di “fixare” un comportamento errato.

I valori opzionali permettono invece, in Swift, di risolvere questo problema in maniera molto chiara e pulita. Se viene utilizzata questa modalità appena descritta, il compilatore genererà infatti un errore. Swift genera infatti un crash nell’esecuzione dell’applicazione se viene utilizzato un parametro opzionale non inizializzato. Questo crash fornisce un comportamento coerente, che facilita l’identificazione e la risoluzione dei bug. L’errore di runtime verrà generato in corrispondenza della linea di codice dove una variabile nil è stata utilizzata. Questo tipo di problematiche possono dunque essere evitate direttamente in fase di scrittura del codice, riducendo enormemente la quantità di tempo (e soldi) che lo sviluppatore dovrebbe dedicare al bug fixing.

Gestione della memoria

Swift ha il supporto completo per l’ARC (Automatic Reference Counting) nell’approccio object-oriented ed in quello procedurale. In Objective-C, l’ARC è supportato all’interno dell’API Cocoa e nel codice object-oriented, ma non non è disponibile per l’apporoccio procedurale (codice C e API come Core Graphics). Ciò significa che sarà responsabilità del programmatore gestire sapientemente la memoria mentre lavora, ad esempio, con le API Core Graphics o altre API di basso livello disponibili in iOS. Gli enormi memory leaks che un programmatore può produrre con Objective-C sono di fatto impossibili in Swift. Dato che l’ARC gestisce la memoria a tempo di compilazione, il programmatore non deve preoccuparsi di gestire manualmente la memoria per ogni oggetto digitale che dovrà creare. L’ARC in Swift funziona sia nell’approccio orientato agli oggetti, sia in quello procedurale, e lo sviluppatore potrà dedicarsi maggiormente sulla logica dell’applicazione senza impegnare la mente in un’ottica di “doppio contesto”, specialmente quando si toccano le API di più basso livello, tipico di Objective-C.

La gestione automatica della memoria e le performance elevate sono, secondo Apple, i principali fattori in grado di aumentare in modo sostanziale la produttività.

Minore prolissità del codice nella gestione delle stringhe

Swift riduce drasticamente la quantità di codice necessaria allo sviluppatore per produrre applicazioni, come nel caso della ripetizioni dei controlli e nella manipolazione delle stringhe. In Objective-C, lavorare con le stringhe è un compito tedioso e prolisso allo stesso tempo, dato che, ad esempio, per combinare 2 stringhe sono richiesti svariati step. Fortunatamente, Swift adotta un approccio molto più moderno e tipico dei comuni linguaggi di programmazione (come Javascript e Java), dove per concatenare 2 stringhe è possibile utilizzare l’operatore “+”, che in Objective-C è assente. L’utilizzo dell’operatore di concatenamento di stringhe è di fondamentale importanza per un linguaggio di programmazione che deve lavorare molto sulla stampa a video di messaggi di testo diretti all’utente. Il sistema dei tipi in Swift riduce ulteriormente la complessità delle righe di codice. In Objective-C il programmatore deve, ad esempio, memorizzare i token “speciali” con cui lavorare con le stringhe, come %s, %d e %@, e passare una lista di variabili separata da virgole che andranno a sostituire i rispettivi token. Con il supporto all’interpolazione delle stringhe, Swift elimina il bisogno di memorizzare i token e permette allo sviluppatore di inserire le variabili direttamente nelle stringhe dirette all’utente, come ad esempio etichette o il testo di un pulsante.

Velocità

Il distacco dalla "dipendenza da C" ha incrementato notevolmente le performance di Swift. I benchmarks dedicati alle performance del codice prodotto con Swift hanno confermato la dedizione di Apple nel migliorare la velocità con cui questo può eseguire le logiche applicative. Come dichiarato dai test rilasciati da Primate Labs, Swift è praticamente alla pari con C++ sia per l’algoritmo FFT che per l’algoritmo Mandelbrot.

Supporto alle librerie dinamiche

Uno dei cambiamenti di maggior importanza introdotti con Swift è il passaggio dale librerie statiche a quelle dinamiche. Le librerie dinamiche sono pezzi di codice eseguibile che possono essere “collegati” ad un’applicazione. Questa caratteristica permette, tra l’altro, di collegare le applicazioni realizzate con Swift con le nuove versioni del suddetto linguaggio mentre questo evolve nel tempo. Lo sviluppatore produce l’applicazione corredata di librerie, entrambe corredate dal certificato di sviluppo che garantisce l’integrità del prodotto. Questo significa che Swift può evolvere più velocemente di iOS, un vantaggio non da poco per un linguaggio di programmazione moderno. I cambiamenti nelle librerie possono essere inclusi con gli ultimi aggiornamenti di un’applicazione disponibile nell’App Store. Le librerie dinamiche non sono mai state supportate da iOS fino al lancio di Swift e iOS 8, nonostante queste siano state supportate sul Mac da molto tempo prima. Le librerie dinamiche sono esterne all’eseguibile dell’applicazione, ma sono incluse nel bundle completo scaricabile dall’App Store. Questo fattore permette di ridurre il peso iniziale dell’applicazione quando viene caricata nella memoria, dato che il codice “esterno” viene collegato solo quando viene utilizzato.

Codice interattivo con i Playgrounds

I nuovi Playground di Swift sono un vantaggio per gli sviluppatori esperti. Essi consentono di testare un nuovo algoritmo o una routine grafica di poche righe di codice, senza dover creare un’intera applicazione per iPhone. Apple ha aggiunto l’esecuzione di codice inline ai Playgrounds per aiutare i programmatori a creare una porzione di codice o scrivere un algoritmo mentre ottengono un contemporaneo feedback.

Questo loop di codice e feedback può migliorare sensibilmente la velocità con cui il codice viene scritto, perché l’approccio tradizionale di sviluppo viene sostituito con la visualizzazione di dati. La programmazione è un processo iterativo, e qualsiasi sforzo che può essere ridotto o diretto al completamento del processo creativo renderà lo sviluppatore più produttivo e dedito ai problemi relativi al codice specifico dell’applicazione, piuttosto che ancorarlo alle tipiche problematiche dei compilatori tradizionali.

I Playgrounds e Swift permettono dunque una nuova modalità di sviluppo, grazie ai feedback visuali che assistono lo sviluppo di algoritmi tramite le visualizzazioni di dati inline. Un loop di feedback più corto e gestibile unito alle descrizioni grafiche non possono che rendere il processo iterativo di scrittura di codice più semplice da effettuare.

Namespace e collisioni di file

Uno dei difetti di Objective-C che più sono stati evidenziati è la mancanza di un supporto formale per i namespace, la soluzione di C++ per le collisioni di codice e nomi di file. Quando in Objective-C accade questo tipo di situazione, viene generato un linker error e l’applicazione non può essere eseguita. Ovviamente esistono degli escamotage, come ad esempio quello di utilizzare un prefisso di (comunemente) 2-3 lettere per differenziare il codice Objective-C da altro codice.

Swift fornisce invece il supporto implicito ai namespace, permettendo allo stesso codice di esistere contemporaneamente tra i vari progetti senza causare crash o richiedere identificativi come NSString o CGPoint (Core Graphics). Anche questa caratteristica incide positivamente sul rendimento degli sviluppatori, basti confrontare semplici keywords come Array, String e Dictionary al posto di NSArray, NSString e NSDictionary, prodotti appunto dalla mancanza di un supporto ai namespace.

Con Swift, i namespace sono basati sul contesto di appartenenza del codice. Questo significa che i programmatori possono differenziare classi o variabili usando lo specifico identificatore del namespace. Questa caratteristica segna un grande cambiamento rispetto ad Objective-C, facilitando l’incorporazione di progetti open-source, framework e librerie all’interno del tuo codice. In questo modo, ad esempio, Facebook e Apple possono usare un file oggetto chiamato Myname.swift senza generare errori.

Se vuoi aggiornamenti su 9 motivi per scegliere Swift e non Objective-C inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su 9 motivi per scegliere Swift e non Objective-C

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing