Eine Schritt-für-Schritt-Anleitung zum Konvertieren einer vollständigen Objective-C-App in Swift

Veröffentlicht: 2018-03-14

Seit ihrer Veröffentlichung im Jahr 2014 hat Apples Programmiersprache Swift ein phänomenales Wachstum erfahren. Die Programmiersprache hat es geschafft, sich einen Platz in der Liste der Top 10 Programmiersprachen zu sichern und teilt sich die Position mit ihrem Vorgänger Objective-C. Aber der Krieg zwischen Swift und Objective-C lässt nie nach.

Mit dieser steigenden Popularität und den aufregenden Funktionen sind viele Entwickler von iOS-Anwendungen, die zuvor mit Obj-C gearbeitet haben, auf die Programmiersprache Swift umgestiegen. Tatsächlich wurden im Kampf um Swift oder Objective-C für iOS verschiedene iOS-Apps wie LinkedIn, Yahoo Weather, Hipmunk und Lyft bereits von Objective-C auf Swift aktualisiert, während viele planen, eine Objective-C-App zu konvertieren zu Swift.

FAKTOREN, DIE SWIFT ZU EINER BESSEREN OPTION MACHEN

Ich persönlich habe die Entwicklung von Swift seit der Veröffentlichung der ersten Version miterlebt und kann sagen, dass Swift Objective-C auf der Grundlage von Faktoren wie Swift gegenüber C ersetzt

Open Source

Swift ist eine Open-Source-Sprache und der Swift-Code kann auf viel mehr Plattformen portiert werden, als Objective-C es jemals war.

Geschwindigkeit

Swift für die iOS-Entwicklung ist eine statisch typisierte Sprache, die mit dem LLVM-Compiler funktioniert und den vorhandenen Code wiederverwenden, ungenutzte Ressourcen löschen, Inline-Funktionen verwalten und so weiter kann. Außerdem basiert seine Arbeitsweise auf einer der schnellsten Berechnungsalgorithmen von C++, was wiederum beweist, dass es einen Wettbewerbsvorteil gegenüber seinem Vorgänger hat.

Nach den Behauptungen von Apple und meiner Erfahrung ist der Swift-Suchalgorithmus 2,6-mal schneller als Objective-C.

Lesbarkeit

Im Gegensatz zu Objective-C ist Swift nicht an C-Grundlagen gebunden. Es ermöglicht iOS-Entwicklern, verschachtelte Methodenaufrufe zu entfernen, ein Semikolon am Ende einer Zeile zu überspringen, das Setzen von @ am Anfang eines Schlüsselworts zu vermeiden, Zeichenfolgen mit dem Zeichen „+“ zu verketten und so weiter. Darüber hinaus ist die Swift-Klasse nicht in Teile unterteilt, die Schnittstelle und die Implementierung. Dadurch wurde die Codelänge auf fast die Hälfte reduziert, wodurch sie besser lesbar wurde.

Als beispielsweise die Lyft-App von Grund auf in der Swift-Sprache neu geschrieben wurde, verringerte sich der App-Code von 75.000 auf 25.000 Zeilen. Diese beeindruckenden Zahlen reduzieren den Aufwand der Entwickler, ohne die Leistung der App auf Kundenseite zu beeinträchtigen.

Interaktive Codierung

Mit seiner Playgrounds-Funktion ließ es die Programmierer einen Teil des Codes oder Algorithmus schreiben, während sie während der Entwicklungsphase Feedback sammelten. Da der Swift-Code mithilfe von Datenvisualisierungen geschrieben wird, wird der App-Entwicklungsprozess einfacher und zugänglicher.

Sicherheit

Swift ist eine sicherere Sprache zum Erstellen einer App gemäß den aktuellen Markttrends. Seine Syntax und sein Sprachkonstrukt haben die Arten von Fehlern ausgeschlossen, die häufig beim Codieren in der Objective-C-Sprache beobachtet werden. Dies bedeutet, dass die Wahrscheinlichkeit von App-Abstürzen und Fällen von problematischem Verhalten geringer ist.

Anders als bei Objective-C kann in Swift geschriebener Code kompiliert und die Fehler zusammen mit dem Codeschreibteil behoben werden. Daher agiert Swift im Testprozess besser und schneller als beim Testen des Objective-C-Codes.

Wartung

Da Swift nicht wie sein Vorgänger von C abhängig ist, ist die Wartung bei der Entwicklung von Swift-Apps viel einfacher. Etwas, das Swift zur Zukunft der Entwicklung von iOS-Apps gemacht hat .

Beim Erstellen einer iOS-App mit Objective-C sollten Entwickler zwei unterschiedliche Codedateien verwalten, um die Erstellungszeit und die Codeeffizienz zu steigern. Swift hat diesen Zwei-Dateien-Mechanismus jedoch fallen gelassen und den Objective-C-Header (.h) und die Implementierungsdateien (.m) in einer einzigen Datei (.swift) zusammengeführt. Der LLVM-Compiler erkennt beim Lesen der Swift-Datei automatisch Abhängigkeiten, was für Entwickler von iOS-Anwendungen ein großer Vorteil ist.

Abgesehen von den oben genannten Faktoren ist der erwähnenswerte Vorteil der Wahl von Swift gegenüber anderen Programmiersprachen von Apple die Kompatibilität mit Objective-C. Apple hat App-Entwicklern die Möglichkeit geboten, beide Sprachen im selben Projekt zu verwenden. Dies ist nicht nur hilfreich, wenn Sie eine iOS-App mit Swift von Grund auf neu entwickeln, sondern auch, um Ihre vorhandene App mit Objective-C-Code auf Swift zu aktualisieren.

Während Sie nun mit den philosophischen Unterschieden zwischen den beiden iOS-Anwendungsentwicklungssprachen vertraut sind, kommen wir zu den Unterschieden bei der praktischen Umsetzung.

SWIFT VS. OBJECTIVE-C: WICHTIGE UNTERSCHIEDE ZWISCHEN DEN TITANEN DER IOS-ENTWICKLUNG

Mit meiner Erfahrung mit komplexer Objective-C-Codebasis und Swift-Codebasis werden Sie auf mehrere Upgrades der bestehenden Konzepte stoßen, zusammen mit einer Einführung in verschiedene neue Elemente, die den App-Entwicklungsprozess beschleunigen. Lassen Sie uns ohne Umschweife einen Blick auf alles werfen, was Sie im Krieg zwischen Swift und Objective C neu/anders finden werden.

Optionen

Wenn wir über die Leistung von Swift vs. Objective-C sprechen, können wir Methoden für Null-Objekte aufrufen, um einen Nullwert in Obj-C zu erhalten. Wir müssen Nullprüfungen manuell durchführen, um undefiniertes Verhalten im Falle eines unerwarteten Nullwerts zu verstehen. Dieses Problem kann jedoch gelöst werden, indem Optional verwendet wird, ein neues Konzept, das in Swift-Code eingeführt wurde. Optional ermöglicht Funktionen, die möglicherweise keinen aussagekräftigen Wert zurückgeben können, einen Wert zurückzugeben, der in optional oder nil gekapselt ist.

Die Syntax zum Deklarieren des optionalen Typs lautet:

Öffentliche Aufzählung Optional<Wrapped> :_Reflectable, NilLiteralConvertible

In der Praxis kann es entweder einen Wert vom Wrapped-Typ oder einen nicht vorhandenen Wert haben.

Swift macht den syntaktischen Zucker zum Deklarieren von Typen optional, sodass wir Optional<String> durch String?

Es gibt hauptsächlich zwei Möglichkeiten, umgepackte Werte aus dem optionalen Container zu erhalten:

Optionale Verkettung: Wird verwendet, wenn die bedingte if-let-Anweisung nur dann einen Wert erhält, wenn dieser existiert.
Forced Wrapping: Wird verwendet, wenn die optional deklarierte Variable nicht null ist. Wenn der Wert vorhanden ist, wird die Ausgabe ohne Implementierung von Bedingungen bereitgestellt. Aber im anderen Fall wird es abstürzen.
Wir können auch implizit ausgepackte Optionals in der Swift-Sprache finden, die als String deklariert sind!

Beispielsweise:

Klasse XKlasse

{

var aString: Zeichenfolge

var bString: Zeichenkette!

var cString: Zeichenkette?

Init (Zeichenfolge: Zeichenfolge)

{

aString = Zeichenfolge

}

}

Hier,

Ein String kann niemals null sein. Wichtig ist, dass diese Variable bei der Objektinitialisierung einen Wert hat, sonst führt das Programm zum Absturz.
B String kann Null sein. Wenn Sie jedoch versuchen, auf ein nil-Objekt zuzugreifen, stürzt das Programm ab.
C String kann null sein und soll als reguläre optionale Variable behandelt werden.
Erweiterungen
Die in Obj-C gefundenen Erweiterungen und Kategorien werden zu einer einzigen Entität konsolidiert, Erweiterungen in Swift-Sprache. Erweiterungen fügen einer bereits vorhandenen Klasse, Enumeration, Struktur oder einem Protokoll neue Funktionalität hinzu, und das Beste daran ist, dass Sie keinen Zugriff auf den ursprünglichen Quellcode haben müssen, um Typen zu erweitern.

Tupel
Neben Optionals ist ein weiterer neuer Datentyp, der in Apples neuer Entwicklungssprache eingeführt wurde, Tupel. Tupel (anstelle benutzerdefinierter Datentypen) werden im Grunde betrachtet, um viele Werte in einer einzigen zusammengesetzten Gruppe zu gruppieren. Es ist das richtige Element, wenn Sie der Meinung sind, dass das Erstellen eines Modells an einem Ort zu viel des Guten sein könnte und das Wörterbuch nicht leserfreundlich genug ist. Weitere Informationen zu Tupeln finden Sie in diesem Blog .

Generika
Generics ist eines der auffälligsten Merkmale der Swift-Programmiersprache, und tatsächlich werden viele der Swift-Standardbibliotheken mit Swift-Code erstellt. Der generische Code ermöglicht es den Entwicklern, flexible, wiederverwendbare Funktionen und Typen zu schreiben, die mit unterschiedlichen Typen arbeiten können, abhängig von den definierten Anforderungen. Dies minimiert das Risiko der Duplizierung und verbessert die Lesbarkeit des Codes durch einen klaren, abstrahierten Ansatz.

Generics ist meiner Erfahrung nach zunächst schwer zu bekommen, genau wie Rekursionen. Aber wenn Sie es in die Hände bekommen, werden Sie in der Lage sein, eine ganz neue Welt der Lösung lästiger logischer Probleme zu entdecken.

Aufzählung
In Objective-C-Code sind Aufzählungen auf primitive Typen beschränkt. Um ganzzahlige Enumerationswerte auf die von Strings zur Anzeige der Ausgabe abzubilden, müssen Sie ein Array einführen oder sich der Switch-Steuerungsstruktur zuwenden. Mit der Swift iOS-App-Entwicklungssprache müssen Sie sich diese Probleme jedoch nicht ersparen.

Swift bietet vielfältige neue Aufzählungen mit mehr Optionen. Swift-Enumerationen können zugeordnete Werte haben und Swift-Enumerationen können einen vordefinierten Satz von Feldern enthalten. Tatsächlich können Swift-Enumerationen rekursiv sein und Rohwerte speichern.

Beispielsweise:
Codes

Indizes
Indizes können als Medium angesehen werden, um auf Informationen aus einer Sequenz, Sammlung oder Liste in Klassen, Enumerationen und Strukturen zuzugreifen, ohne eine Methode zu verwenden. Sie können Indizes in Betracht ziehen, um Werte nach Index festzulegen und abzurufen, ohne separate Methoden zum Speichern und Abrufen zu erstellen. Beispielsweise können Sie auf Elemente in einer Array-Instanz als someArray[index] und auf Elemente in einer Dictionary-Instanz als someDictionary[key] zugreifen.

Die Syntax zum Deklarieren eines Index lautet wie folgt:

Index (Index: Int) -> Int {

werden {

//zum Deklarieren des tiefgestellten Werts

}

set (neuerWert) {

//zum Definieren von Werten

}

}

Geben Sie Inferenz ein

Swift schlug auch Typsicherheit für die Entwicklung von iOS-Anwendungen vor, wonach eine Variable, wenn sie mit einem bestimmten Typ deklariert wird, statisch und unveränderlich ist. Der Compiler bestimmt (oder leitet ab), welchen Typ Ihre Variable auf der Grundlage der von Ihnen zugewiesenen Werte haben wird.

Beispielsweise:

Code 1
Hier zeigt der Compiler einen Fehler an, wenn Sie versuchen, eine str2-Variable mit numerischen Werten zu initialisieren (siehe unten).

Code 03

Funktionen
Die Funktionssyntax in der Programmiersprache Swift ist flexibler zu definieren als die im komplexen Objective-C-Codestil. In Swift hat jede Funktion einen Typ, der aus den Parametertypen der Funktion und dem Rückgabetyp der Funktion besteht, was bedeutet, dass Sie einer Variablen Funktionen zuweisen oder sie als Wert an andere Funktionen übergeben können (wie im folgenden Beispiel gezeigt):

Bild des Codes

Abgesehen davon ließ Swift die App-Entwickler auch Standardwerte für Funktionsparameter definieren.

Fehlerbehandlung
Swift bietet einen völlig neuen Ansatz zum Werfen, Fangen, Zirkulieren und Manipulieren von behebbaren Fehlern zur Laufzeit. Einen Einblick in die Fehlerbehandlung in Swift erhalten Sie im Blog.

Abgesehen von diesen gibt es verschiedene Konzepte, die die Swift-App-Entwicklung zu einer Win-Win-Situation gegenüber der Objective-C-App-Entwicklung machen:

Modelle
Im Fall von Swift sind Modelle eher Strukturen als Klassen.

Protokolle
Im allerersten Apple WWDC-Video wurde Swift als „protokollorientierte Sprache“ vorgestellt. Ein Protokoll kann als Blaupause von Methoden, Eigenschaften und anderen Entitäten definiert werden, die für eine bestimmte Aufgabe/Funktionalität geeignet sind. Sie können von einer Klasse, Enumeration oder Struktur umfasst werden, um eine tatsächliche Implementierung dieser Anforderungen zu erleichtern, und sind im Vergleich zu Obj C mit den Funktionen zum Bereitstellen von Standardimplementierungen, Einbinden von Generika usw. weitaus leistungsfähiger.

Als iOS-App-Entwickler ziehe ich es vor, ein Protokoll zu erstellen, bevor ich eine Klasse definiere, da dies die effektivste Methode ist, um die Vorteile der fortschrittlichen Programmiersprache von Apple zu nutzen.

Funktionaler Programmieransatz
Swift versetzt Entwickler in die Lage, mehr funktionale Ansätze zur Lösung alltäglicher Probleme zu verwenden, als herkömmliche Schleifen oder Referenztypen zu verwenden. Hier besteht die Perspektive darin, ein Problem im Hinblick darauf zu analysieren, was die Lösung ist, anstatt zu bestimmen, wie man die Lösung erhält, wie es beim traditionellen Ansatz der Fall ist.

Aus meiner Erfahrung mit der iOS-Sprache ist mir aufgefallen, dass das, was wir durch Iterationen mit for-Schleifen in Objective-C gemacht haben, mit dem Konzept von Filter, Map und Reduce in Swift durchgeführt werden kann. Ausführliche Informationen zu diesen Funktionen höherer Ordnung in der funktionalen Programmierung finden Sie im Blog.

SCHRITT-FÜR-SCHRITT-ANLEITUNG ZUR KONVERTIERUNG EINER VOLLSTÄNDIGEN OBJECTIVE-C-APP AUF SWIFT

Heutzutage gibt es verschiedene Tools, um eine App Zeile für Zeile von Objective-C nach Swift zu konvertieren. Ich rate jedoch davon ab, welche zu verwenden. Obwohl beide iOS-Sprachen interoperabel sind, sind ihre Programmparadigmen unterschiedlich. Die direkte Migration einer App von Obj-C zu Swift birgt ein höheres Risiko, die falschen Paradigmen zu verwenden. Lassen Sie mich darauf näher eingehen.

Swift ist im Gegensatz zu seinem Vorgänger vom funktionalen Programmierparadigma beeinflusst, wodurch es stark auf Unveränderlichkeit angewiesen ist. Wenn Sie beispielsweise von Arrays und Dictionaries sprechen – diese Basismodelle werden in Objective-C als Referenztyp verwendet, in Swift sind sie jedoch Werttypen und daher unveränderlich. Dies impliziert, dass die unbewusste Konvertierung des Obj-C-Codes in Swift mit einem beliebigen Tool dazu führen wird, dass Sie mit vielen Fehlern konfrontiert werden, die schwer zu debuggen sind. Außerdem hat Swift tonnenweise neue Funktionen (wie oben bereits beschrieben), die die Algorithmen/Ansätze effizienter machen und schneller programmieren! Tatsächlich ist dies der Hauptgrund, warum Apple eine neue Sprache vorgestellt hat, anstatt Obj-C zu aktualisieren. Unter Berücksichtigung all dieser Punkte empfehle ich allen dringend, eine neue App in Swift von Grund auf neu zu schreiben, anstatt eine zeilenweise Konvertierung von Obj-C nach Swift vorzunehmen.

Wenn Sie jedoch eine vollständige Objective-C-App in Swift konvertieren möchten, können Sie Swiftify als Tool verwenden. Das Tool vereinfacht den Prozess der Aktualisierung von Obj-C-Code auf die neue Programmiersprache von Apple mit einem Klick; Einsparung von Tausenden von Arbeitsstunden. Die Funktion der Interoperabilität ermöglicht es, konvertierten iOS-Code problemlos wieder in Objective-C zu integrieren, was bedeutet, dass Sie die unzähligen Optionen erkunden können, die Swift bietet, und ihn dann wieder in Ihr Obj-C-Projekt integrieren können, ohne alles auf einmal neu schreiben zu müssen.

Bereiten Sie Ihren vorhandenen App-Code für die Konvertierung vor
Es ist immer besser, mit dem neuesten Obj-C-Code zu beginnen. Dies liegt daran, dass Xcode über einen modernen Objective-C-Konverter verfügt, der Ihnen bei Folgendem helfen kann:

1. Wo immer möglich, ID in Instanztyp ändern
2. Verwenden der richtigen Enum-Makros
3. Upgrade auf die neuere @property-Syntax

Während der Konverter bei der Mechanik der Analyse und Anwendung möglicher Änderungen hilft, bildet er nicht die Semantik des Codes ab. Daher ist es für alle Entwickler von iOS-Anwendungen ratsam, alles einmal manuell zu überprüfen und die Änderungen dann zu bestätigen.

Um den Konverter zu verwenden, wählen Sie Bearbeiten -> Umgestalten -> Auf moderne Objective-C-Syntax umstellen.

Der Prozess der Migration von Objective-C-Code zu Swift
Der effektivste Ansatz zum Konvertieren einer vollständigen Objective-C-App in Swift ist zunächst eine Klasse nach der anderen, insbesondere eine Klasse ohne Unterklasse, da Sie in Obj-C keine Unterklassen von Swift-Klassen erstellen können.

Ersetzen Sie die .m- und .h-Dateien, die sich auf die Klasse beziehen, durch eine einzelne .swift-Datei. Damit gelangt alles von der Schnittstelle bis zur Implementierung automatisch in die Swift-Datei. Außerdem müssen Sie keine Header-Datei erstellen, da Xcode bei Bedarf automatisch einen Header generiert.

Entwerfen einer Bridging-Header-Datei
Wenn Sie Ihre erste .swift-Datei hinzufügen, finden Sie eine Eingabeaufforderung wie die unten gezeigte.

Schnellcode12

Klicken Sie auf die Option „ Brückenkopf erstellen “.

Eine Schritt-für-Schritt-Anleitung

1. Wählen Sie ein Paar .h- und .m-Dateien aus, die Sie in Swift konvertieren möchten. Wenn Sie das gesamte Projekt konvertieren möchten, lassen Sie die AppDelegate-Klasse für später stehen.
2. Suchen Sie im gesamten Code nach #import „MyViewController.h“ und entfernen Sie es aus der Objective-C Bridging Header-Datei ([MyProject]-Bridging-Header.h).
3. Ersetzen Sie Instanzen von #import „[Dateiname].h“ durch #import „[MyProject]-Swift.h“ in allen .m-Dateien und fügen Sie @class [Dateiname] anstelle von #import „[Dateiname].h“ ein alle .h-Dateien.
4. Wandeln Sie den Teil der Obj-C-Dateien in Swift um. Dies kann einfach mit der Finder-Erweiterung von „Swiftify for Xcode“ durchgeführt werden. Andernfalls kopieren Sie den Inhalt von .m- und .h-Dateien in .swift und verwenden Sie die Option „Datei in Swift konvertieren“, die in der Swiftify Xcode-Erweiterung verfügbar ist.
5. Ersetzen Sie die .h- und .m-Dateien durch konvertierte .swift-Dateien im Projekt.
6. Kompilieren Sie das Projekt und beheben Sie die Konvertierungsfehler. Während viele Probleme mit den Auto-Fix-Vorschlägen von Xcode einfach gehandhabt werden, können Sie sich auch darauf verlassen, dass Swiftify die Fehler meldet und behebt, die mehrmals im Projekt auftreten.
7. Wenn Sie fertig sind, erstellen Sie das Projekt und führen Sie es aus. Wenn das Problem „Klasse nicht gefunden“ mit anschließendem Absturz auftritt, finden Sie alle Verweise darauf im Storyboard-Editor. Geben Sie den Klassennamen im Identity Inspector erneut ein, speichern Sie und versuchen Sie es erneut.
8. Wenn Sie das gesamte Projekt konvertieren, können Sie die AppDelegate-Klasse jetzt transformieren. Zu diesem Zeitpunkt wurden alle anderen Dateien in Swift konvertiert, und wenn im Ziel keine Obj-C-Dateien mehr vorhanden sind, können Sie die Dateien main.m und .pch (vorkompilierter Header) problemlos löschen.

Welche Vorgehensweise bevorzugen Sie – eine neue iOS-App in Swift von Grund auf neu erstellen oder Objective-C vollständig in Swift konvertieren? Teilen Sie Ihre Ansichten über den Kommentarbereich unten.