Swift ist jetzt Open Source

Es ist soweit. Apple hat es ja im April auf der WWDC 2015 angekündigt, dass geplant ist Swift bis zum Ende des Jahres als Open Source Projekt zu veröffentlichen. Seit heute hat Swift ein neues zuhause — Swift.org.

Nun können auch Pinguine mit Swift entwickeln, wenn auch nicht mit den Cocoa Frameworks. Man kann gespannt sein wann die Community Swift auf andere Plattformen bringt, und welche Projekte in Zukunft mit Swift hervorkommen.

Der Source Code ist auf GitHub zu finden und ist vor allem in C++.

Und wie man schnell der Seite entnehmen kann, hat die Arbeit an Swift 3 längst begonnen…

Apple Special Event – September Keynote

Am Mittwoch den 9. September stellte Apple seine neuen Produkte auf der September Keynote vor. Ich fasse kurz zusammen:

Was bedeutet das für App Entwickler?

Mit watchOS2 können native Apps auf der Apple Watch ausgeführt werden. Release ist der 16. September.

Apple hat jetzt neben OS X, iOS und watchOS mit tvOS ein neues Betriebssystem in seiner Familie. Zukünftig sollen Apps für Apple TV im App Store angeboten werden, natürlich auch Games. Man könnte annehmen, dass sich Apple somit auch in den Konsolen Markt reinschleicht.

Das iPad Pro ist für mich kein Mobil Gerät mehr, es ist einfach zu groß. Aber genau da setzt Apple an. Mit dem Smart Keyboard hat man eine alternative zum Macbook, und der Apple Pencil macht daraus ein Zeichentablett. Mein Anschein ist, Apple versucht das iPad aus der Leseecke zu holen und es für Productivity Apps zu verbessern.

iOS 9 soll ebenfalls am 16. September veröffentlicht werden. Die wohl größte Neuerung für App Entwickler ist Multitasking: a) Mit Slide Over wechselt man Apps ohne diese zu schliessen. b) Mit Split View können zwei aktive Apps Seite an Seite bearbeitet werden. c) Mit Picture in Picture können Videos oder Facetime als kleines Fenster in einer anderen App dargestellt werden.

Zu Swift gab es keine Neuigkeiten.

XCTest Unit Testing Framework

In der Software Entwicklung wird das korrekte Verhalten von Software idealerweise durch Test Code geprüft. Apple spendiert seit Xcode 5 mit XCTest ein neues Unit Testing Framework, mit welchen auch Test Driven Development praktiziert werden kann.

An dieser Stelle möchte ich nur einen Einblick ins Testen mit XCTest geben. Wer testen lernen will, dem kann ich z.B. das Buch Test Driven Development by Example von Kent Beck empfehlen.

Starten wir ein neues Swift Projekt namens MyApp

Testen mit Xcode

Um ein Projekt zu Testen generiert Xcode folgende Dinge, wie im Projekt Navigator zu sehen:

  • MyAppTests: Eine eigene Gruppe für Test Code
  • MyAppTest.swift: Ein Beispiel Test
  • MyAppTests.xctest: Ein Test Produkt

xcode-tests

Wenden wir uns den Tests zu, genauer gesagt MyAppTests.swift. Der von Xcode automatisch genierte Code bietet eine gute Grundlage um mit dem Schreiben von Tests loszulegen:

Wie man sieht, MyAppTests ist eine Sub-Klasse von XCTestCase weshalb auch das XCTest Framework importiert werden muss.

Die Klasse selbst enthält vier Methoden: Die von der Super-Klasse zu überschreibenden Methoden setUp() und tearDown() enthalten Code der vor und nach einem Test ausgeführt wird. Die Methoden testExample() und testPerformanceExample() sind Tests, wie durch den Prefix test leicht zu erkennen ist. Alle Tests der XCTestCase Klassen werden ausgeführt.

Der Erfolg eines Test wird mit einer Assertion überprüft — einer Aussage über den Zustand des Programms. Entweder der Test besteht oder fällt durch. Dazu stellt das XCTest Framework ein paar Assert Funktionen zur Verfügung.

Boolean Tests

XCTAssert(expression) — testet ob eine Aussage wahr ist
XCTAssertTrue(expression) — wie XCTAssert
XCTAssertFalse(expression) — testet ob eine Aussage falsch ist

Äquivalenz Tests

XCTAssertEqual(value, expected) — tested ob beide Werte gleich sind
XCTAssertNotEqual(value, expected) — tested ob beide Werte nicht gleich sind
XCTAssertEqualWithAccuracy(value, expected, accuracy) — tested ob beide Werte innerhalb einer Toleranz liegen
XCTAssertNotEqualWithAccuracy(value, expected, accuracy) — tested ob beide Werte nicht innerhalb einer Toleranz liegen
XCTAssertGreaterThan(value, expected) — tested ob der erwartete Wert größer ist
XCTAssertGreaterThanOrEqual(value, expected) — tested ob der erwartete Wert gleich oder größer ist
XCTAssertLessThan(value, expected) — tested ob der erwartet Wert kleiner ist
XCTAssertLessThanOrEqual(value, expected) — teste ob der erwartete Wert kleiner oder gleich ist
XCTAssertEqualObjects(object1, object2) — testet ob zwei Objekte gleich sind
XCTAssertNotEqualObjects(object1, object2) — testet ob zwei Objekte nicht gleich sind

Nil Tests

XCTAssertNil(expression) — testet ob ein Wert nil ist
XCTAssertNotNil(expression) — testet ob ein Wert nicht nil ist

XCTFail

XCTFail() — generiert einen Test Fehler; z.B. bei bekannten fehlerhaften ifthenelse oder switchcase Fällen.

Tests schreiben

Ein neuer Unit Test wird erzeugt indem man eine neue Test Case Klasse erstellt …

new-testnew-test-class
… für hier soll aber MyAppTests.swift genügen.

  1. Wichtig ist: XCTest importieren, Test Klasse ist eine Sub-Klasse von XCTestCase, ein Name eines Test Case beginnt mit test.
  2. Um ein Modul zu testen muss auch das zu testende Modul importiert werden, also die Datei welche den produktiv Code enthält.
  3. Die Funktionen zu überschreibenden Methoden setUp() und tearDown() enthalten Code um die Test Cases vorzubereiten bzw. zu beenden.
  4. Jetzt kann man seinen Test Case schreiben, wobei der Name der Methode mit test beginnt, und in welcher ein XCTAssert den Zustand prüft.

Test ausführen

Es gibt mehrere Möglichkeiten eine App zu testen. Am einfachsten ist dies wahrscheinlich über das Menu ‘Product/Test‘, und im Terminal sieht man die Ergebnisse. Schneller geht es über Shortcuts: Die Test Suite sowie auszuführen geht mit⌘-U.

Der Erfolg eines Tests lässt sich über die Konsole auswerten. Des weiteren hilft ein Blick auf den Test Navigator (links), durch welchen man einen Übersicht aller Tests bekommt, und durch das nebenstehende Icon erfährt ob der Test bestanden ist oder nicht. Auch im Quellcode finden sich die selben Icons wieder, zum Entsprechenden Test Case und Assert.testthrough

 

Asynchrones Testen

Seit Xcode 6 ist es möglich asynchronen Code zu testen. Was heist das? Code der nicht Schritt für Schritt ausgeführt wird (sequentiell) um ein Ziel zu erreichen, kann eine parallel ausführende Aufgabe verfolgen. Es kann aber auch vorkommen, dass dieses Aufgabe noch nicht erfüllt wurde; z.B. ein Web Request wenn der Server Down ist. Der Haupt- und Nebenjob laufen separat, der Erfolg vom Hauptjob ist allerdings abhängig vom Erfolg des Nebenjob.

Um mit dieser Situation umgehen zu können führte Apple sogenannte Expectations (Erwartungen) ein und läuft folgendermaßen ab: Eine Expectation wird definiert, wartet bis die Expectation erfüllt ist, und erfüllt während dessen asynchron die Expectation:

 

Open Source Projekte

Mir stellt sich die Frage, welche Open Source Projekte gibt es eigentlich in Swift? Die Suchmaschine meine Wahl führte mich zu einigen interessanten Ergebnissen.

Den Anfang mache ich mit ein paar Listen, die Open Source Projekte für iOS und OS X sammeln, aber nicht auf Swift beschränkt sind.

CocoaPods ist ebenfalls eine Quelle für zahlreiche Projekte. Die Specs beinhalten die Paketabhängigkeiten der Pods, in welchen sich der Links zum  eigentlichen Projekt befindet.

Einen schnellen Blick auf coole aktuelle Projekte versprechen GitHub Trends. Ansonsten, wer gilt ‘wer sucht der findet’.

Auch Apple hat eine eigen Open Source Seite für ihre Projekte. Es wurde ja bereits angekündigt, dass Apple Swift als Open Source veröffentlichen möchte.

Backend mit Parse

Mit der Entwicklung von Mobile Apps entfacht schnell der Wunsch anfallende Daten zu speichern. Nicht selten so, dass diese auch auf anderen Geräten zugänglich sind. Der Wunsch nach einem Backend, einer Cloud kommt auf.

Datenverwaltung kann komplex werden: Wie kommen Daten in die App, sicher und geschützt, für genau die richtigen Personen, auf lange Sicht?

Nicht jeder hat Zeit und Muse eine eigene Lösung zu entwickeln, und so haben sich einige StartUps dieser Problematik angenommen und stellen App Entwicklern einen Dienst zur Verfügung — (Mobile) Backend As A Service (kurz BaaS). Die zum BaaS bereitgestellten SDKs unterstützen in der Regel:

  • Push Benachrichtigungen
  • Social Sharing
  • Cloud Speicher
  • Chat und Messaging
  • Benutzerverwaltung
  • Nutzungsanalyse

Einer beliebter Dienst unter Mobile App Entwicklern ist Parse, welchen man kostenfrei ausprobieren kann und dazu recht umfangreich ist. Am Rande erwähnt, Parse gehört seit 2013 zu Facebook.

Anmeldung bei Parse

Um die Dienste von Parse in Anspruch zu nehmen muss man sich anmelden und seine App registrieren (z.B. parseDemo). Das ganze geht vorbildlich schnell und einfach, wer möchte auch mit seinem Facebook, GitHub oder Google Konto.
signup

Projekt Templates

Kaum angemeldet erscheint eine schlanke Quickstart Seite mit Möglichkeiten von Parse. Klickt man sich durch, erhalt man eine Anleitung samt Projekt Template.

parse

Parse SDK in Xcode

Um Parse in seine App zu integrieren benötigt man das Parse SDK:

https://parse.com/downloads/ios/parse-library/latest

Für ein Beispiel sollte ein neues Xcode Projekt herhalten, welches dem Parse Projekt entspricht. Dann den Ordner der heruntergeladenen Parse SDK in den Projekt Navigator von Xcode schieben.

Da die Parse SDK in Objective-C geschrieben wurde, braucht man um diese mit Swift zu nutzen eine Objective-C Bridging Header Datei (das Tutorial zum Thema ist geplant). Dazu schnell dem Projekt eine neue Objective-C Datei hinzufügen; der Name ist egal, da sie gleich wieder gelöscht wird. Beim speichern fragt Xcode ob man einen Bridging Header erstellen möchte, worauf man mit Yes antwortet und der Bridging Header wird automatisch erstellt. Nun kann man die eigene Datei löschen.

bridgingheader
Im Bridging Header — parseDemo-Briding-Header.h — importiert man die benötigten Parse SDK Frameworks.

Verbindung mit Parse

Als nächstes braucht man seinen API Schlüssel, um sich von der App aus mit Parse zu verbinden. Dazu geht in Parse auf Settings und dann Keys. Wichtig für uns sind die Application ID und Client Key.

parsekeys
Innerhalb der AppDelegate.swift Datei stellt man in application(_:didFinishLaunchingWithOptions:) die Verbindung zu Parse her:

Parse Dokumentation

An dieser Stelle  komme ich hier zum Ende und verweise auf die offizielle Parse Dokumentation. Hier bekommt man alle wesentlichen Informationen wie man mit Parse arbeitet — als Guide, Referenz und Tutorials.

CocoaPods

CocoaPods ist eine Paketverwaltung für Swift und Objective-C Cocoa Projekte. Es hat über zehntausend Bibliotheken und kann dir helfen dein Projekt elegant zu skalieren.

CocoaPods ist inspiriert vom RubyGems, und soll helfen Bibliotheken von Dritt-Anbietern einbinden, was mit Xcode auch mal leicht daneben gehen kann wenn nicht alles richtig konfiguriert ist.

Mit CocoaPods kann man die gewünschte Bibliothek einfach in das Podfile hinzufügen, führt das Kommando pod install aus und hat weiter keine Probleme — alles wird heruntergeladen und konfiguriert.

Installation

CocoaPods wird vom Terminal mit Ruby installiert, und benötigt sudo Rechte.

Pods verwenden

Einfach nach Pods suchen. Die Abhängigkeiten der Datei Podfile im Xcode Projekt Verzeichnis speichern, z.B.:

Alle Pods und Abhängigen Pakete ins Projekt installieren:

Den Xcode Workspace starten, nicht nur das Projekt:

Pakete im Code importieren:

Eigene Pods

Findet sich kein geeigneter Pod kann man leicht selbst einen erstellen:

Genauere Anleitungen findet man bei den CocoaPods Guides.

Fazit: CocoaPods scheint eine großartige Methode zu sein Bibliotheken von Fremdanbietern in sein Projekt zu integrieren, und davon gibt es echt eine Menge wie im Master Specs Repository zu sehen ist.

Und wer einfach mal einen Pod ausprobieren möchte, kann das mit der zugehörigen Demo:

 

Apple Watch Entwicklung

Überall hört man “die Apple Watch ist noch ein 1. Generation Gerät”. Ich will das gar nicht kommentieren, und eher einen Überblick über App Entwicklung für Apples neustes Familienmitglied geben.

Die Apple Watch ist anders. Wie Tim Cook anmerkte “es ist kein geschrumpftes iPhone”, was nicht nur an der Darstellung und Bedienung deutlich wird. Mit watchOS gibt es ein neues Betriebssystem für die Uhr (und das Upgrade steht bereits in den Startlöchern).

Zur App Entwicklung für Apples Armbanduhr wurde ein neues Framework bereitgestellt: WatchKit. WatchKit Apps sind zur Zeit recht eingeschränkt in ihren Möglichkeiten, da sie immer ein iPhone benötigen, keine Daten auf der Uhr speichern, keine direkte Internetverbindung haben, und nicht auf deren Sensoren zurückgegriffen werden kann. Native Apps wurden für diese Jahr aber angekündigt. Somit sind Watch Apps nicht direkt im App Store einsehbar, sondern in eine iPhone App eingebettet. Nach dem Download einer App mit Apple Watch Unterstützung auf das iPhone, wird diese automatisch and die Uhr übertragen.

Eine Anwendung besteht aus zwei Teilen:

  • Watch App: Wird auf der Uhr installiert und ausgeführt, und enthält nur das UI (Storyboard).
  • WatchKit Extension: Wird auf dem iPhone installiert und ausgeführt, und enthält die Logik.

Da sowohl Watch und iPhone zum Ausführen benötigt werden kann man sagen, dass die Uhr quasi als externes und interaktiver Display funktioniert. Zur Kommunikation nutzen beide Geräte das stromsparende Bluetooth LE.

So mag man es durchaus positiv sehen, die Leistung vom iPhone nutzen zu können, aber natürlich gibt es auch Einschränkungen. Die Bildschirmauflösung ist auf 312×390 bzw. 272×340 Pixeln beschränkt. Touch-Gesten und Eingaben über die Krone können nicht wie bei iOS selbst interpretiert werden, sondern wird von watchOS übernommen.

Des weiteren schreibt Apple drei App Kategorien vor:

  • Notifications: Eine interaktive Benachrichtigung wird angezeigt, mit bis zu Knöpfen.
  • Glances: Mini-Berichte einer App auf einem Screen; ohne scrollen und umschalten.
  • Watch Apps: Entweder navigierbare Listen mit Detail Ansichten, oder nebeneinander angeordnete seitenbasierte Ansichten.

Eine Watch App Entwickeln

Indem ein neues Build-Target (File/New/Target) für die Apple Watch erstellt wird, führt man dieses dem bestehenden iOS Projekt hinzu. Xcode erstellt den nötigen Rest für die Watch App und und WatchKit Extension.
new-watchapp-target watchapp-projekt

Möchte man seine Watch App im Simulator testen, erscheint zunächst das iPhone. Zusätzlich muss im Menu “Hardware/External Displays” eine Apple Watch hinzugefügt werden.

Die Programmierung einer Watch App ist ähnlich wie unter iOS, aber es gibt doch ein paar eigen Klassen: Statt dem UIViewController für iOS verwendet eine Watch App den WKInterfaceController, bzw. für Notifications den WKUserNotifiationInterfaceController.

Auch der Lebenzyklus ist iOS ähnlich. Objekte wird mit initWithContext: instanziiert, gefolgt von willActive und beim beenden didDeactivate.

 

Objective-C kurz und bündig

Gegenwärtig kommen OS X und iOS Entwickler um Objective-C nicht ganz vorbei. Swift ist einfach noch zu jung, teilweise noch nicht komplett dokumentiert, Code Beispiele fehlen, oder einige Features sind (noch) nicht umgesetzt. Klar, Swift ist ein Überflieger und wird in der Apple Gemeinde eine gute Zukunft haben, aber noch scheint Objective-C als Standard für Entwickler herhalten zu müssen. Vielleicht dauert es noch 1-2 Jahre.

Kurzum: Als Apple Developer sollte man Objective-C Code zumindest lesen können.

Im folgenden möchte ich auf Objective-C eingehen, und zwar im Sinne wie Apple Swift ankündigte, als “Objective-C ohne C” — ohne auf C und OOP einzugehen.

Einführung

Objective-C (kurz ObjC) ist eine objektorientierte Programmiersprache, welche auf der Programmiersprache C basiert. Ihr Ursprung reicht ins Jahr 1980 als Brad Cox und Tom Love einen durch  Smalltalk inspirierten Prä-Prozessor entwickelten, welcher C um objektorientierte Eigenschaften ergänzt. 1988 lizensierte NeXT Objective-C, und began mit der Entwicklung von AppKit und Foundation, der Grundlage von NeXTStep. Nach Apples kauf von NeXT im Jahr 1996 wurde NeXTStep zur Grundlage von Mac OS X.

Wie man sieht ist Objective-C eng mit OS X und den Cocoa Frameworks verbunden.

Klassen und Objekte

Klassen sind die Grundpfeiler der OOP, aus welchen Objekte instanziiert werden werden. Objekte werden im Speicher abgelegt, und enthalten Werte als Attribute in Instanz Variablen, welche in Objective-C mit einem vorangehenden Unterstrich gekennzeichnet werden (z.B. _name). Neben den Attributen beinhalten Klassen Methoden, und sind in der OOP das Gegenstück zu Funktionen. Allerdings mit dem kleinen Unterschied, dass nur die Methoden einer Klasse auf seine Instanz Variablen zugreifen. In Objective-C schickt man einem Objekt eine Nachricht um eine Methode auszuführen.

Objekt-Instanzen

Objekte erstellen

Über einen Zeiger erhält man Zugriff auf das Objekt einer Klasse; dabei wird aber keine Objekt im Speicher erstellt. Da es sich auch nicht um eine Instanz-Variable handelt, gibt es auch keinen Unterstrich.

Um ein Objekt zu erstellen, sendet man einer Klasse die Nachricht alloc, welche auf dem Heap das Objekt erstellt und die Speicheradresse zurückgibt.

Damit ein Objekt benutzt werden kann, muss der neuen Instanz noch Nachricht zur Initialisierung gesendet werden. Da eine Objekt immer erstellt und initialisiert werden muss, kann dieser Vorgang in einem sogenannten nested message send zusammengelegt werden.

Nachrichten senden

Nun kann man das Objekt benutzen, und ihm weitere Nachrichten senden. Diese sind wie folgt aufgebaut: Nachrichten sind immer in eckigen Klammern und bestehen aus drei Teilen:

  1. Empfänger: Zeiger auf das auszuführende Objekt
  2. Selektor: Die auszuführende Methode
  3. Argumente: Parameterwerte an die auszuführenden Methode.

Methoden und Nachrichten können mehrere Argumente tragen (oder keine wie init). In der Praxis sieht es folgendermaßen aus:

Beachte den Unterschied zwischen Methoden und Nachrichten: Methoden sind ausführbarer Code, Nachrichten nur die Anfrage eine Methode auszuführen, wobei der Name einer Nachricht immer der einer Methode gleicht.

Objekte löschen

Objekte bleiben im Speicher am leben bis sie gelöscht werden. Dazu setzt man das Objekt auf nil, um so auf ein abwesendes Objekt zu zeigen.

An dieser Stelle ist anzumerken, dass Variablen mit dem Wert nil dennoch Nachrichten gesendet werden können, ohne diese darauf zu prüfen um einen Absturz zu vermeiden.

Hallo Welt

Erstellt man in Xcode ein Command Line Projekt für OS X erhält man das allseits bekannte Hallo Welt in der Datei main.m. Das Suffix .m ist steht für Objektive-C Method/Implementation Dateien, weil .c und .o schon vergeben waren; Header Dateien nutzen wie gewohnt .h als Suffix.

Ähnlich include in C werden mit import Frameworks eingebunden. Auch die main Funktion ist wie in C.

Mit NSLog werden Text auf der Konsole wiedergegeben. Etwas ungewöhnlich ist, dass vor einem String ein @-Zeichen steht.

Der autoreleasepool hilft im Zusammenspiel mit ARC (automatischer Referenzzählung) Objekt-Besitz zu Verwaltung, und somit Speicherlecks. Mit beenden des Codeblocks verlieren alle in ihm geschaffenen Objekte einen Besitzer.

Klassen

Erstellt man eine neue Klasse, erhält man eine .h Header Datei und eine .m Implementations Datei. Die Header Datei deklariert die Klasse, Superklasse, Instanz Variablen und Methoden. Aufgebaut ist sie wie folgt:

In der entsprechenden Implementations Datei importiert man die Header Datei und implementiert die Methoden, und sieht dann so aus:

Zugriff auf Instanz Variablen

Nun kann man Methoden nutzen. Dazu gibt es zwei Wege: 1) Durch das senden von expliziten Zugriffs Nachrichten:

Üblicherweise wird heutzutage eher die Dot Notation verwendet, auch von Apple:

Klassen Methoden und Instanz Methoden

Es gibt zwei Arten von Methoden:

  • Klassen Methoden (+): Nachrichten werden an die Klasse direkt gesendet, z.B. zum erstellen einer neuen Instanz. Man kann diese mit statischen Methoden anderer Programmiersprachen vergleichen.
  • Instanz Methoden (-): Nachrichten werden an die Instanz einer Klasse gesendet.

Beispielsweise wird so mit alloc eine Klassen Methode and die Klasse gesendet um eine Instanz zu schaffen, und dieser Instanz sendet man mit init eine Instanz Methode um es zu initialisieren.

Überschreiben von Methoden

Eine Methode wird einfach nur in der Implementations Datei überschrieben; deklariert wurde sie in die Superklasse. Als Beispiel, die description Methode von NSObject:

Initialisierer

Die Klasse NSObject vererbet des weiteren die Methode init zum initialisieren einer Instanz. Es steht einem frei eigene Methoden zur Initialisierung zu erstellen. Initialisierer  unterscheiden sich von Methoden durch folgende Regeln:

  • Ihr Name beginnt mit dem Wort init
  • Ihr Return-Typ ist instancetype (früher auch id, was einem void * entspricht)

Wie andere Methoden können Initialisierer Argumente aufnehmen.

Jede Klasse benötigt einen Initialisierer der sicher stellt, dass alle Instanz Variable einen gültigen Wert haben — einen sogenannte designated Initialisierer.

Bei der Implementierung des designierten Initialisierer muss zuerst der designierte Initialisierer der Super-Klasse mit super aufgerufen werden. Eine gescheiterte Initialisierung gibt nil zurück. Der self-Zeiger wird implizit für jedes Objekt erstellt, und ist ein Zeiger auf sich selbst. Auch wenn Instanz Variablen innerhalb einer Klasse besser über Zugriffs Methoden  (Getter und Setter) benutzt werden sollen, sollte man die Werte beim Initialisieren direkt setzten (auch wenn es Ausnahmen der Ausnahme gibt). Zuletzt wird das neu initialisierte Objekt als Rückgabewert zurückgegeben.

Hat die Super Klasse einen anderen designierten Initialisierer muss dieser überschrieben werden, um den eigenen designierten Initialisierer direkt oder indirekt aufzurufen, sodass alle Instanz Variablen des Objekts gültig sind.

Arrays

In Objective-C enthalten Arrays keine Werte sondern Referenzen zu Objekten. Von daher können Objective-C Arrays verschiedene Typen aufnehmen, C Primitive und Strukturen müssen allerdings mit NSNumber, NSValue und NSData verpackt werden. Einem Array kann nicht nil hinzugefügt werden; für diesen Zweck gibt es NSNull. Auf Arrays kann per Nachricht oder Index-Schreibweise zugegriffen werden.

Im Gegensatz zu NSArray kann ein NSMutableArray nach der Initisialisierung noch geändert werden.

Das Cocoa Framework

Ehrlich, Swift und Objective-C sind eigentlich einfach. Meiner Meinung nach ist die viel größere Hürde in der App Entwicklung für Apple Systeme das Cocoa Framework. Wenn man aber einmal versteht wie Cocoa und Cocoa Touch funktioniert erkennt man das Potential.

Die Geschichte von Cocoa

Nachdem Steve Jobs Apple verließ gründete er NeXT Computer, um ein neues, elegantes und fortschrittliches Computersystem zu entwickeln. Allerdings floppte das Projekt 1993, und schloß seine Pforten. Das Betriebssystem und die Entwicklungstools wurden dennoch als NeXTSTEP von NeXT Software weiterverkauft. Der Vorteil von NeXTSTEP war, daß man schnell seine Ideen als Software verwirklichen konnte. Im wesentlichen besteht es aus drei Komponenten:

  • Einen stabilen Unix-Kernel
  • Einen Window Server um Benutzer Eingaben zu verarbeiten, welche dann an die App weitergeleitet werden und zu guter letzt Dargestellt werden, entweder auf dem Bildschirm oder Drucker.
  • Elegante und umfangreiche Bibliotheken (Frameworks) und Tools zum Programmieren, welches zu OpenStep umbenannt wurde.

Selbst Apple nutzt NeXTSTEP für ihr Betriebssystem, und geriet dabei aber außer Rand und Band. Ein neues OS musste her. So kaufte Apple NeXT im Dezember 1996, und Steve Jobs kehrte kurz darauf zurück zu Apple.

Aus NeXTSTEP wurde Mac OS X und aus OpenStep wurde Cocoa, und erschien in seiner ersten Version im Jahr 2001; 2012 wurde Mac OS X einfach zu OS X umgetauft.

Auch iOS basiert auf der selben Technologie, und nutzt mit Cocoa Touch eine für Mobil-Geräte angepassten Entwicklungszweig. Dadurch ist die Entwicklung in den beiden Welten oft sehr ähnlich, wenn nicht identisch.

Cocoa Frameworks

Ein Framework ist eine Sammlung von Klassen die zusammengehören, dann zu einer Bibliothek kompiliert werden, und alle Komponenten in einem Ordner mit der Endung .framework vereint. Cocoa besteht aus drei grundlegenden Frameworks:

  • Foundation – die Standardbibliothek enthält Typen, Sammlungen und Utility Klassen für alles mögliche, und bildet die Grundlage für Cocoa Apps.
  • AppKit / UIKit – die Bibliothek zum darstellen der Benutzeroberfläche; AppKit für OS X und UIKit für iOS.
  • Core Data – eine Bibliothek zum speichern und laden von Objekt Daten.

Darüber hinaus gibt es zahlreiche Frameworks für alle möglichen Einsatzgebiete, z.B. GameKit, iAd, MapKit, WebKit, AddressBook, AVFoundation, Core Image, Core Animation, etc.

Cocoa Tools

Apple liefert mit Xcode eine kostenlose IDE für die Entwicklung von Cocoa Apps, und beinhaltet alles was man zum programmieren benötigt: Code Editor, Compiler, Debugger, GUI Editor, Profiler

Swift 2.0

Es wird Zeit für ein paar ältere Neuigkeiten — ging bei mir aus beruflichen Gründen nicht eher — aber mit der letzten Apple WWDC 2015 im Juni hat sich um Swift einiges getan. Also besser später als nie.
Swift generiert schnelleren Code.
Kommentaren können Markdown Syntax beinhalten, und somit Rich Text und
Bilder.

  • Neue Syntax Feature für noch sicheren und lesbaren Code
  • Error Handling mit try-catch Blöcken
  • Compiler integrierte Optimierung für die OS Version.
  • Aber vor allem Swift wird im Laufe des Jahres als Open Source veröffentlicht, auch
    für Linux.

Natürlich gibt es dazu mit Xcode 7 eine neue IDE, und mit OS X 10.11. El Capitan und iOS 9 neue Betriebssystem Upgrades und Features.

Error Handling

Apple hat wohl seine Meinung geändert, dass Laufzeitfehler nicht unbedingt Fehler der Programmierung sein müssen. Die Möglichkeit Fehler mittels try-catch Blöcken wie in anderen Sprächen üblich ist doch eine nette Ergänzung. Somit ist es möglich mit throw einen Fehler im Programm kontrolliert auszulösen, und diesen mit catch abzufangen und behandeln. Zudem kann man eigene ausdrucksstarke Fehlertypen erstellen. Die Entwickler von Swift haben dabei Wert darauf gelegt, dass das neue Error Handling Model mit NSError und dem Cocoa Framework funktioniert. Ein kleines Beispiel: