objective-c-swift

In vielen Situationen begegnet Dir auch als Swift-Entwickler noch Objective-C. Das Cocoa/Touch Framework wird mit beiden Sprachen aktiv verwendet. Wenn Du Beispiele für bestimmte Szenarien suchst, begegnen Dir daher nicht nur Swift. Damit Du sie besser verstehst, lernst Du in diesem Leitfaden Beispiele zur Umwandlung von Objective-C zu Swift kennen.

Semikolon nicht vergessen

Bei einem Wechsel zwischen Swift und Objective-C ist häufig das Semikolon am Ende der Statements die größte Schwierigkeit. In Objective-C muss dies angegeben werden:

Swift ist nicht so streng. Auch da gibt es Situationen in denen das Semikolon wichtig ist, aber grundsätzlich ist es in den meisten Situationen überflüssig:

Wenn Du später von Objective-C zu Swift wechselst, schreibst Du häufig automatisch ein Semikolon. Das ist nicht notwendig, aber in Swift zum Glück auch kein Fehler.

Variablen deklarieren vs. Typ-Inferenz

In Objective-C wird der Datentyp bei der Deklaration immer angegeben. Auch wenn direkt ein Wert zugewiesen wird, erkennt Objective-C den Typ nicht. Hier werden einige Variablen erzeugt:

In zentraler Unterschied in Swift ist die Typ-Inferenz. Anhand der hinterlegten Werte leitet Swift automatisch den Datentyp ab. Der wird trotzdem für die Lebensdauer der Variable festgelegt:

Das Keyword var deklariert Variablen. Ganz ähnlich könnten aber auch nicht veränderbare Konstanten entstehen, und zwar unabhängig vom Datentyp. Das Konzept kennt Objective-C nicht.

Konstanten und Variablen: Immutable und Mutable

Unter Objective-C gibt es veränderbare (mutable) und nicht veränderbare (immutable) Datentypen. Das Paradebeispiel ist die Klasse NSArray (nicht veränderbar) und ihr Gegenstück NSMutableArray (veränderbar). Ob Daten geändert werden können, steuert die Logik der Klasse, nicht Objective-C direkt:

Diese Idee gehört zur DNA von Swift. Es gibt Konstanten und Variablen. Aber sie werden nicht über eigene Klassen definiert. Stattdessen kann jeder Datentyp über var zur Variable bzw. let als Konstante deklariert werden:

Das gilt für Klassen und die Basisdatentypen wie z.B. numerische Werte gleichermaßen.

Numerische Werte

Die primitiven Datentypen von Objective-C stützen sich in weiten Teilen auf die Programmiersprache C. Dazu gehören ganze Zahlen (short, long, int) und Kommazahlen (float, double). Hinzu kommt unter Objective-C der Datentyp BOOL (Wahrheitswerte).

Es gibt aber in Objective-C noch eine Besonderheit. Und das ist die Klasse NSNumber. Sie kann die verschiedenen Datentypen als Objekt repräsentieren:

Das wird tatsächlich sehr häufig genutzt. In Swift gibt es dieses Konzept nicht direkt. Stattdessen werden explizite Datentypen verwendet:

Beispiel dafür sind die Core Data Managed Objects. Werden sie mit Swift erstellt, wird die Verwendung von „skalaren Datentypen“ unterstützt.

Boolesche Literale

Unter Objective-C gibt es drei mögliche Wege um Wahrheitswerte auszudrücken. Das sind YES/NO, true/false und auch 1/0:

Das war in Swift bereits zu Beginn ganz konsequent geregelt:

Der Datentyp heißt hier Bool und erlaubt ausschließlich true und false.

Strings erstellen

Die String unter Objective-C bauen auf der Klasse NSString aus. Es handelt sich um Objekte und Referenz-Typen:

Unter Swift sind Strings deutlich übersichtlicher. Das „@“ vor dem String-Literal entfällt:

Außerdem ermöglicht die Interpolation sehr übersichtlichen Code. In die Konstante url wird einfach der String aus domain eingefügt.

Strings vergleichen

Stringvergleiche werden in Objective-C direkt auf der Instanz mit der Methode isEqualToString durchgeführt:

Unter Swift ist das etwas leichter. Hier werden einfach Werte verglichen:

Strings mit readline lesen

Unter Objective-C werden Strings über libreadline eingelesen und dann direkt über die Klassenmethode stringWithUTF8String zu einem NSString umgewandelt:

Auch hier ist die Swift-Variante etwas einfacher, da die zusätzlich Konvertierung nicht notwendig ist:

Umgang mit Objekten

Objekte werden in beiden Sprachen sehr unterschiedlich verwendet. In Objective-C werden zum einen die Variablen explizit als Pointer deklariert, ganz ähnlich wie unter C. Außerdem ist auch der Zugriff anders. Im Vordergrund stehen dabei eckige Klammern:

Die Erstellung von Objekten ist in Swift relativ schlank:

Statt des häufigen alloc/init… wird nur der Initializer aufgerufen. Der Zugriff auf Eigenschaften und Methoden erfolgt über die Dotsyntax, ähnlich wie z.B. in Java und JavaScript.

Arrays, Dictionaries und Sets

Es gibt Arrays, Dictionaries und Sets in Objective-C. Zentraler Aspekt bei der Portierung: sind sie als mutable (veränderbar) oder immutable (nicht veränderbar) deklariert? Über Literale erstellte Datenstrukturen sind immutable. Die veränderbare Variante muss explizit deklariert werden:

Unter Swift unterscheidest Du mit den Keywords var und let bei der Deklaration zwischen Variablen und Konstanten:

Unterschiede zwischen Kontrollstrukturen

Die Kontrollstrukturen sind nahezu identisch. Die klassische C-Style for-Schleife ist in Swift 3 nicht mehr vorhanden. In Objective-C steht die Schleifenbedingung in Klammern. Außerdem müssen Variablen in der Schleife explizit deklariert werden:

Swift leitet den Datentyp der temporären Variable „name“ vom Typ des Arrays ab:

Die Bedingungen mit if, while-Schleifen und Co sind fast identisch.

Kostenloser Download


Bonus: Gerade keine Zeit? Dann HIER KLICKEN, das kostenlose eBook herunterladen und später weiterlesen!

Klassen erzeugen

Die Definition von Klassen ist ein beiden Sprachen komplett unterschiedlich. In Objective-C sind Schnittstelle und Implementierung separat. Außerdem gibt es zwei Dateien,  den Header (.h) mit der Schnittstelle und die Datei mit der Logik (.m):

In Swift gibt es diese Trennung nicht. Das Konzept orientiert sich viel mehr an Java. Es gibt nur eine .swift-Datei, in der alles hinterlegt wird:

Streng genommen gibt es unter Swift sogar noch eine Unterscheidung zwischen struct und class. Mit dem Keyword struct können unter Swift klassenähnliche Strukturen erzeugt werden, eine abgespeckte Version der Klassen. Das ist aber ein anderes Thema.

Eigenschaften festlegen

Die Eigenschaften der Klasse werden unter Objective-C über die Direkte @property erzeugt. Öffentliche Eigenschaften stehen im interface einer Klasse (in der .h-Datei):

Unter Swift sind dies einfache Variablen, die lediglich direkt in der Klassendefinition stehen (meist ganz oben):

Auch hier gibt es zusätzlich die Unterscheidung zwischen Variablen (var) und Konstanten (let).

Methoden deklarieren

Die Methoden in Objective-C werden in der Schnittstelle deklariert (falls öffentlich) und in der Implementierung umgesetzt. Dabei unterscheidet sich der Aufbau wesentlich:

  • über -/+ wird angegeben, ob es eine Klassen- oder Instanzmethode ist
  • in Klammern folgt der Rückgabetyp (in diesem Fall NSString)
  • dann folgt der Methodenname (hier xyz)
  • dann werden die Parameter genannt

In der Praxis kann das wie folgt aussehen (inklusive Header- und Implementierung):

Unter Swift sieht es ähnlich aus. Hier wird der Rückgabewert allerdings erst nachgestellt deklariert. Alle Parameter werden zudem per Komma getrennt übergeben:

  • das Keyword func leitet die Methode ein
  • es folgt der Methodenname (hier xyz)
  • dann folgen Parameter
  • abschließend wird der mögliche Rückgabewert genannt

Das Beispiel aus der Datei Datenbank.swift sieht dann in Swift wie folgt aus:

Die Unterscheidung zwischen Instanz- und Klassenmethode bietet auch Swift. Ohne weitere Angabe handelt es sich aber automatisch um (deutlich häufiger verwendete) Instanzmethoden.

Praxisbeispiel

Abschließend noch ein Beispiel aus der Praxis. Du suchst ein Beispiel für den Umgang mit NSDate und der Formatierung. Du findest ein Beispiel bei Stackoverflow. Allerdings handelt es sich um Objective-C Code:

So setzt Du es in Swift um:

Fazit

In der Praxis gibt es natürlich noch mehr Details und Syntaxeigenschaften. Aber mit nur etwas Übung kannst Du wirklich schnell die wichtigsten Merkmale von Objective-C lernen. Selbst wenn Du nicht in Objective-C entwickelst, kannst Du nach kurzer Zeit bereits den Code lesen und genau nachvollziehen.

Schreib einen Kommentar

Your email address will not be published.