Una guida passo passo per convertire un'app Objective-C completa in Swift
Pubblicato: 2018-03-14Dalla sua uscita nel 2014, il linguaggio di programmazione di Apple Swift ha subito una crescita fenomenale. Il linguaggio di programmazione è riuscito a farsi un posto tra i primi 10 linguaggi di programmazione , condividendo la posizione con il suo predecessore, Objective-C. Ma la guerra di swift contro l'obiettivo-C non si addolcisce mai.
Con questo aumento di popolarità e funzionalità interessanti, molti sviluppatori di applicazioni iOS che in precedenza lavoravano con Obj-C sono passati al linguaggio di programmazione Swift. In effetti, all'interno della lotta tra swift o Objective-C per iOS, varie app iOS come LinkedIn, Yahoo Weather, Hipmunk e Lyft sono già state aggiornate da Objective-C a Swift, mentre molti stanno pianificando di convertire un'app Objective-C a Swift.
FATTORI CHE RENDONO SWIFT UN'OPZIONE MIGLIORE
Personalmente, ho visto l'evoluzione di Swift da quando è stata svelata la sua prima versione e posso dire che tra Swift e C, Swift sostituisce Objective-C in base a fattori, come
Open Source
Swift è un linguaggio open source e il codice Swift può essere trasportabile su molte più piattaforme rispetto a Objective-C.
Velocità
Swift per lo sviluppo iOS è un linguaggio tipizzato statico che funziona con il compilatore LLVM e può riutilizzare il codice esistente, eliminare le risorse inutilizzate, gestire funzioni inline e così via. Inoltre, il suo funzionamento si basa su una delle aritmetiche di calcolo degli algoritmi più veloci del C++, che a sua volta dimostra di avere un vantaggio competitivo rispetto al suo predecessore.
Secondo quanto affermato da Apple e da me sperimentato, l'algoritmo di ricerca Swift è 2,6 volte più veloce di Objective-C.
Leggibilità
A differenza di Objective-C, Swift non è legato alle basi C. Consente agli sviluppatori iOS di rimuovere le chiamate al metodo nidificato, saltare un punto e virgola alla fine di una riga, evitare di inserire @ all'inizio di una parola chiave, concatenare stringhe usando il segno "+" e così via. Inoltre, la classe Swift non è divisa in parti, l'interfaccia e l'implementazione. Ciò ha ridotto la lunghezza del codice di quasi la metà, rendendolo più leggibile.
Ad esempio, quando l'app Lyft è stata riscritta da zero in linguaggio Swift, il codice dell'app è diminuito da 75.000 a 25.000 righe. Queste cifre impressionanti hanno ridotto gli sforzi degli sviluppatori senza influire sulle prestazioni dell'app presso il cliente.
Codifica interattiva
Con la sua funzione Playgrounds, consente ai programmatori di scrivere un pezzo di codice o algoritmo raccogliendo feedback durante la fase di sviluppo. Poiché il codice Swift viene scritto utilizzando visualizzazioni di dati, ciò rende il processo di sviluppo dell'app più semplice e accessibile.
Sicurezza
Swift è un linguaggio più sicuro per la creazione di un'app secondo le attuali tendenze del mercato. La sua sintassi e il costrutto del linguaggio ha escluso i tipi di errori comunemente osservati durante la codifica nel linguaggio Objective-C. Ciò implica che ci sono minori possibilità di arresto anomalo dell'app e casi di comportamento problematico.
A differenza di quanto avviene nel caso di Objective-C, il codice scritto in Swift può essere compilato e gli errori possono essere corretti, insieme alla parte di scrittura del codice. Quindi, Swift agisce meglio e più velocemente nel processo di test, rispetto al processo di test del codice Objective-C.
Manutenzione
Poiché Swift non dipende da C come il suo predecessore, la manutenzione in caso di sviluppo di app Swift è molto più semplice. Qualcosa che ha reso Swift il futuro dello sviluppo di app per iOS .
In caso di creazione di un'app iOS utilizzando Objective-C, gli sviluppatori avrebbero dovuto mantenere due file di codice distinti per aumentare il tempo di compilazione e l'efficienza del codice. Tuttavia, Swift ha abbandonato questo meccanismo a due file, unendo l'intestazione Objective-C (.h) e i file di implementazione (.m) in un unico file (.swift). Il compilatore LLVM rileva automaticamente le dipendenze durante la lettura del file Swift, il che è un grande vantaggio per gli sviluppatori di applicazioni iOS.
A parte i fattori sopra menzionati, il vantaggio degno di nota della scelta di Swift rispetto ad altri linguaggi di programmazione Apple è la sua compatibilità con Objective-C. Apple ha offerto agli sviluppatori di app la possibilità di utilizzare entrambe le lingue nello stesso progetto. Questo non è solo utile in caso di sviluppo di un'app iOS utilizzando Swift da zero, ma anche per aggiornare l'app esistente a Swift utilizzando il codice Objective-C.
Mentre ora hai familiarità con le differenze filosofiche tra i due linguaggi di sviluppo di applicazioni iOS, passiamo alle differenze durante l'implementazione pratica.
SWIFT VS OBIETTIVO-C: GRANDI DIFFERENZE TRA I TITANI DELLO SVILUPPO IOS
Con la mia esperienza con la complessa base di codice Objective-C e la base di codice Swift, ti imbatterai in diversi aggiornamenti ai concetti esistenti insieme a un'introduzione a vari nuovi elementi che rendono rapido il processo di sviluppo dell'app. Senza indugiare, diamo un'occhiata a tutto ciò che troverai di nuovo/diverso nella guerra di swift contro l'obiettivo c.
Optional
Quando parliamo di prestazioni swift vs Objective-C, possiamo chiamare metodi su oggetti nil per ottenere un valore zero in Obj-C. Dobbiamo eseguire manualmente i controlli nulli per comprendere il comportamento indefinito in caso di valore nullo imprevisto. Tuttavia, questo problema può essere risolto utilizzando Optional, un nuovo concetto introdotto nel codice Swift. Optional consente alle funzioni che potrebbero non essere in grado di restituire un valore significativo di restituire un valore incapsulato in un optional o nil.
La sintassi per dichiarare il tipo Optional è:
Enum pubblico Opzionale<Wrapped> :_Reflectable, NilLiteralConvertible
In pratica, può avere un valore di tipo Wrapped o un valore non esistente.
Swift rende facoltativo lo zucchero sintattico per la dichiarazione dei tipi, quindi possiamo sostituire Optional<String> con String?
Esistono principalmente due modi per ottenere il valore avvolto dal contenitore facoltativo:
Concatenamento facoltativo: utilizzato nel caso in cui l'istruzione condizionale if-let riceverà un valore solo se esiste.
Avvolgimento forzato: utilizzato quando la variabile dichiarata facoltativa è diversa da zero. Se il valore esiste, fornirà l'output senza condizioni di implementazione. Ma, nell'altro caso, andrà in crash.
Possiamo anche trovare optional implicitamente scartati nel linguaggio Swift, dichiarato come String!
Per esempio:
Classe XClasse
{
var aString: String
var bString: Stringa!
var cString: String?
Init (stringa: stringa)
{
aString = stringa
}
}
Qui,
Una stringa non può mai essere nulla. È fondamentale che questa variabile abbia un valore durante l'inizializzazione dell'oggetto, altrimenti il programma provocherà un arresto anomalo.
La stringa B può essere nulla. Tuttavia, se si tenta di accedere all'oggetto nil, il programma si arresterà in modo anomalo.
C String può essere nullo e dovrebbe essere trattata come una normale variabile opzionale.
Estensioni
Le estensioni e le categorie trovate in Obj-C sono consolidate in un'unica entità, estensioni in linguaggio Swift. Le estensioni aggiungono nuove funzionalità a una classe, un'enumerazione, una struttura o un protocollo già esistenti e la parte migliore è che non è necessario avere accesso al codice sorgente originale per estendere i tipi.
Tuple
Oltre agli Optionals, un altro nuovo tipo di dati introdotto nel nuovo linguaggio di sviluppo di Apple è Tuples. Le tuple (al posto del tipo di dati definito dall'utente) sono fondamentalmente considerate per raggruppare molti valori in un unico gruppo composto. È l'elemento giusto da considerare se ritieni che la creazione di un modello in un luogo possa essere eccessivo e il dizionario non è abbastanza facile da leggere. Per saperne di più Tuple, fai riferimento a questo blog .
Generici
Generics è una delle caratteristiche più sorprendenti del linguaggio di programmazione Swift e, infatti, gran parte delle librerie standard Swift sono create con il codice Swift. Il codice generico consente agli sviluppatori di scrivere funzioni e tipi flessibili e riutilizzabili che possono funzionare con diversi set di tipi, in base ai requisiti definiti. Ciò riduce al minimo il rischio di duplicazione e migliora la leggibilità del codice con un approccio chiaro e astratto.
Secondo la mia esperienza, Generics è difficile da ottenere all'inizio, proprio come le ricorsioni. Ma, quando ci metti le mani sopra, sarai in grado di rilassarti in un mondo completamente nuovo per risolvere noiosi problemi logici.
Enumerazione
Nel codice Objective-C, le enumerazioni sono limitate ai tipi primitivi. Per mappare i valori dell'enumerazione dei numeri interi a quelli delle stringhe per la visualizzazione dell'output, è necessario introdurre una matrice o girare verso la struttura di controllo dello switch. Tuttavia, non è necessario affrontare questi problemi con il linguaggio di sviluppo di app Swift per iOS.
Swift offre diverse nuove enumerazioni con più opzioni. Le enumerazioni Swift possono avere valori associati e il caso di enumerazione Swift può contenere un insieme predefinito di campi. In effetti, le enumerazioni Swift possono essere ricorsive e possono memorizzare valori grezzi.
Per esempio:
Pedici
I pedici possono essere visti come un mezzo per accedere alle informazioni da una sequenza, una raccolta o un elenco in classi, enumerazioni e strutture senza utilizzare un metodo. Puoi considerare gli indici per impostare e recuperare valori in base all'indice senza creare metodi separati per l'archiviazione e il recupero. Ad esempio, puoi accedere agli elementi in un'istanza Array come someArray[index] e agli elementi in un'istanza Dictionary come someDictionary[key].
La sintassi per dichiarare un pedice è la seguente:
pedice (indice: Int) -> Int {
ottenere {
//per aver dichiarato il valore dell'indice
}
set (nuovo valore) {
//per definire i valori
}
}
Digitare Inferenza
Swift ha anche proposto la sicurezza dei tipi per lo sviluppo di applicazioni iOS, in base alla quale una variabile quando dichiarata con un tipo particolare, il suo tipo sarà statico e non modificabile. Il compilatore determinerà (o dedurrà) quale tipo sarà la tua variabile sulla base dei valori che assegni.
Per esempio:
Qui, il compilatore mostrerà un errore quando si tenta di inizializzare con valori numerici su una variabile str2 (vedi sotto)
Funzioni
La sintassi della funzione nel linguaggio di programmazione Swift è più flessibile da definire rispetto a quella nel complesso stile di codice Objective-C. In Swift, ogni funzione ha un tipo che comprende i tipi di parametro della funzione e restituisce il tipo, il che implica che puoi assegnare funzioni a una variabile o passarla come valore ad altre funzioni (come mostrato nell'esempio seguente):
Oltre a questo, Swift ha anche consentito agli sviluppatori di app di definire i valori predefiniti per i parametri funzionali.
Gestione degli errori
Swift offre un approccio completamente nuovo per lanciare, catturare, far circolare e manipolare gli errori recuperabili in fase di esecuzione. Per dare un'occhiata alla gestione degli errori in Swift, fai riferimento al blog.
Oltre a questi, vari concetti che rendono lo sviluppo di app Swift un vantaggio per tutti rispetto allo sviluppo di app Objective-C sono:
Modelli
Nel caso di Swift, i modelli sono preferiti come struct piuttosto che classi.
Protocolli
Nel primo video della WWDC di Apple, Swift è stato introdotto come "linguaggio orientato al protocollo". Un protocollo può essere definito come un progetto di metodi, proprietà e altre entità che si adattano a un particolare compito/funzionalità. Possono essere abbracciati da una classe, un'enumerazione o una struttura per facilitare un'effettiva implementazione di tali requisiti e sono molto più potenti rispetto a Obj C con le caratteristiche di fornire implementazioni predefinite, incorporare generici, ecc.
Come sviluppatore di app iOS, preferisco creare un protocollo prima di definire una classe come la pratica più efficace per sfruttare i vantaggi del linguaggio di programmazione avanzato di Apple.
Approccio alla programmazione funzionale
Swift consente agli sviluppatori di utilizzare più approcci funzionali per risolvere problemi banali rispetto all'impiego di loop o tipi di riferimento tradizionali. Qui, la prospettiva è analizzare un problema in termini di quale sia la soluzione, invece di determinare come ottenere la soluzione come fatto nell'approccio tradizionale.
Dalla mia esperienza con entrambi i linguaggi iOS, una cosa che ho notato è che ciò che stavamo facendo con le iterazioni usando i cicli for in Objective-C può essere fatto usando il concetto di Filtro, Mappa e Riduci in Swift. Per ottenere informazioni approfondite su queste funzioni di alto livello nella programmazione funzionale, fare riferimento al blog.
GUIDA PASSO PER PASSO PER CONVERTIRE UN'APP COMPLETA DI OBIETTIVO-C IN SWIFT
Oggi ci sono vari strumenti per convertire un'app da Objective-C a Swift riga per riga. Consiglio comunque di non utilizzarne nessuno. Sebbene entrambi i linguaggi iOS siano interoperabili, i loro paradigmi di programma sono diversi. La migrazione diretta di un'app da Obj-C a Swift comporterà un rischio maggiore di utilizzare i paradigmi sbagliati. Mi permetta di approfondire questo.
Swift, a differenza del suo predecessore, è influenzato dal paradigma della programmazione funzionale, il che lo rende fortemente basato sull'immutabilità. Ad esempio, se parli di array e dizionari, questi modelli di base sono usati per essere un tipo di riferimento in Objective-C, ma sono tipi di valore in Swift, quindi immutabili. Ciò implica che convertire inconsciamente il codice Obj-C in Swift utilizzando qualsiasi strumento ti farà affrontare molti errori difficili da eseguire il debug. Inoltre, Swift ha tonnellate di nuove funzionalità (come già descritto sopra) che rendono gli algoritmi/approcci più efficienti e programmano rapidamente! In effetti, è il motivo principale per cui Apple ha svelato un nuovo linguaggio piuttosto che aggiornare Obj-C. Con tutti questi punti in considerazione, consiglio vivamente a tutti di scrivere una nuova app in Swift da zero piuttosto che eseguire la conversione riga per riga da Obj-C a Swift.
Tuttavia, se desideri convertire un'app Objective-C completa in Swift, uno strumento che puoi utilizzare è Swiftify. Lo strumento semplifica il processo di aggiornamento del codice Obj-C al nuovo linguaggio di programmazione di Apple in un clic; risparmiando migliaia di ore di lavoro. La funzione di interoperabilità consente di integrare il codice iOS convertito in Objective-C senza alcun problema, il che implica che puoi esplorare la miriade di opzioni offerte da Swift e quindi reintegrarlo nel tuo progetto Obj-C senza riscrivere tutto in una volta.
Prepara il codice dell'app esistente per la conversione
È sempre meglio iniziare con l'ultimo codice Obj-C. Questo perché Xcode si avvale di un moderno convertitore Objective-C che può aiutarti con:
1. Modifica dell'id in instancetype ove possibile
2. Impiegando le macro enum corrette
3. Aggiornamento alla sintassi @property più recente
Sebbene il convertitore aiuti con i meccanismi di analisi e applicazione di potenziali alterazioni, non descrive la semantica del codice. Pertanto, è consigliabile che tutti gli sviluppatori di applicazioni iOS rivedano tutto manualmente una volta e quindi confermino le modifiche.
Per utilizzare il convertitore, seleziona Modifica -> Refactor -> Passa alla sintassi moderna di Objective-C.
Il processo di migrazione del codice Objective-C a Swift
L'approccio più efficace per convertire un'app Objective-C completa in Swift è, per cominciare, una classe alla volta, in particolare una classe senza alcuna sottoclasse poiché non puoi sottoclassare le classi Swift in Obj-C.
Sostituisci i file .m e .h relativi alla classe con un unico file .swift. Con questo, tutto, dall'interfaccia all'implementazione, entrerà automaticamente nel file Swift. Inoltre, non è necessario creare un file di intestazione poiché Xcode genera automaticamente un'intestazione, se necessario.
Progettazione di un file di intestazione di bridging
Quando aggiungi il tuo primo file .swift, troverai un messaggio come quello mostrato di seguito.
Fare clic sull'opzione ' Crea bridging Header '.
Una guida passo passo
1. Scegli una coppia di file .h e .m che desideri convertire in Swift. Se vuoi convertire l'intero progetto, lascia la classe AppDelegate per dopo.
2. Cerca #import "MyViewController.h" in tutto il codice e rimuovilo dal file di intestazione del bridging di Objective-C ([MyProject]-Bridging-Header.h).
3. Sostituisci le istanze di #import “[nomefile].h” con #import “[MyProject]-Swift.h” in tutti i file .m e inserisci @class [nomefile] invece di #import “[nomefile].h” in tutti i file .h.
4. Trasforma la parte dei file Obj-C in Swift. Questo può essere fatto facilmente usando l'estensione Finder di "Swiftify per Xcode". Altrimenti, copia il contenuto dei file .me .h in .swift e usa l'opzione "Converti file in Swift" disponibile nell'estensione Swiftify Xcode.
5. Sostituire i file .h e .m con i file .swift convertiti nel progetto.
6. Compila il progetto e correggi gli errori di conversione. Sebbene molti problemi possano essere gestiti facilmente utilizzando i suggerimenti di correzione automatica di Xcode, puoi anche fare affidamento su Swiftify per segnalare e correggere gli errori che compaiono più volte nel progetto.
7. Una volta terminato, crea ed esegui il progetto. Se si verifica il problema di "Classe non trovata" seguito da un arresto anomalo, trova tutti i riferimenti ad esso nell'Editor Storyboard. Reinserire il nome della classe in Identity Inspector, salvare e riprovare.
8. Se stai convertendo l'intero progetto, puoi trasformare la classe AppDelegate ora. A questo punto, tutti gli altri file sono stati convertiti in Swift e quindi, se non ci sono file Obj-C rimasti nella destinazione, puoi facilmente eliminare il file main.m e .pch (intestazione precompilata).
Quale pratica preferisci: creare una nuova app iOS in Swift da zero o convertire completamente Objective-C in Swift? Condividi le tue opinioni tramite la sezione commenti qui sotto.