Kapitel 2: Grundlagen / 2.9 Optionals / 2.9.3 Optionals sind Wrapper

Wie die Überschrift sagt: Optionals sind Wrapper. Aber was sind Wrapper?

Das Konzept von Wrappern in der Programmierung ist schon sehr alt. Es gibt kein gutes deutsches Wort dafür, am nähesten kommt allenfalls noch Umhüllung. Deutschsprachige Programmierer nennen Wrapper darum meistens einfach Wrapper, sprechen bei einem Objekt mit einem Wrapper drumherum auch manchmal von einem eingewickelten Objekt, oder von einem Objekt, das sie einwickeln (wrappen) oder auswickeln (unwrappen). Wenn es deutschsprachig wird, dann umschreibt man dabei in der Regel folgendes Bild:

Stellen Sie sich eine Schokokugel vor. Das ist unser Objekt, zum Beispiel ein String. Mit der Schokokugel können Sie einige sinnvolle Dinge tun, zum Beispiel sie in den Mund stecken und sich schmecken lassen. Einige Dinge können Sie damit aber nicht so gut, zum Beispiel sie für den Verkauf glänzen lassen oder sie vor dreckigen Fingern schützen. Dafür wickeln Sie die Schokokugel in ein Bonbonpapier ein (wrappen). Das ist unser Wrapper. Eine dünne, temporäre Hülle für unser Objekt, unseren String.

Jetzt können sie andere, neue Dinge mit dem Objekt machen: Sie können den Schokobonbon in die Auslage packen oder Gästen anbieten. Und sie können in dem String, solange er umwickelt und ein Optional ist, den Wert nil speichern.

Schokobonbon wie optionaler String behalten ihre ursprünglichen Eigenschaften bei, sie gehen nicht verloren, nur sind sie im umwickelten Zustand nicht alle zugänglich. Den Schokobonbon werden sie nicht eingewickelt in den Mund stecken wollen, wenigstens aber nicht genießen können und den Wert eines optionalen Strings können Sie nicht mehr an einen gewöhnlichen String übergeben, jedenfalls nicht, ohne eine Exception dafür zu kassieren.

Um die ursprünglichen Eigenschaften, die durch das Einwickeln verloren gegangen sind wieder herzustellen, müssen Sie den Schokobonbon genauso wie den String wieder auswicklen (unwrappen). Dann haben Sie wieder einen schönen String oder eine leckere Schokokugel.

Technisch gesehen sind Optionals also Wrapper, die einen regulären Typ umwickeln und ihn mit der zusätzlichen Möglichkeit ausstatten, den Wert nil anzunehmen.

Ich will Ihnen kurz mit Hilfe der Begriffe Eigenschaft und Methode einer Klasse beschreiben, wie Sie selbst einen solchen Optional-Wrapper programmieren könnten – zwar weniger elegant als Apple das gemacht hat aber grundsätzlich funktionsfähig. Sie müssen das noch nicht verstehen, diesen Satz sage ich auch nicht zum ersten Mal, aber sie können es vielleicht verwenden, um eine ungefähre Vorstellung zu gewinnen. Details dazu gibt es später, wenn es um Klassen geht.

Wir bauen eine Klasse mit zwei Eigenschaften, zwei Werten, die wir in der Klasse speichern können: Einen Integer namens integerWert und einen Boolean namens isNil. Wir bauen also einen optionalen Integer. Die Integer-Eigenschaft integerWert enthält den Integer-Wert des ungewrappten Objekts, also eine Zahl. Das Boolean isNil enthält, ob der Wert nil gespeichert ist: true repräsentiert „ja, dieses Optional ist nil“ und false repräsentiert „nein, dieses Optional speichert einen Zahlenwert“.

Dann verpassen wir unserer Klasse zwei Methoden: setValue(..) speichert einen Wert und getValue() liest den Wert wieder aus. Wenn setValue(..) den Wert nil übergeben bekommt, also klassenname.setValue(nil) aufgerufen wird, dann setzt diese Methode die Eigenschaft isNil auf true. Wird setValue(..) mit einer Zahl aufgerufen, also zum Beispiel mit der Zahl 23 über klassenname.setValue(23), dann wird die Zahl 23 in der Eigenschaft integerWert gespeichert und isNil wird auf false gesetzt. So speichert man Werte in unserem Optional.

Um Werte auch wieder auslesen zu können, Sie denken sich das vielleicht schon, müssen wir noch die Methode getValue() implementieren, also auch diese Methode mit Code versehen. Das machen wir so: Wird getValue() aufgerufen, schauen wir zuerst nach, ob isNil true ist. Falls ja, geben wir nil zurück. Falls nein, geben wir den Wert aus integerWert zurück.

Fertig ist unser selbstgebautes Integer-Optional. Und ja, das ganze ist ein bißchen hölzern, und ja, wir können wegen der Typsicherheit von Swift nicht nil und eine Zahl mit derselben Methode entgegennehmen, dazu benötigen wir zwei und ja, das gleiche gilt auch für den Rückgabewert, dort müssten wir ggf. auf einen Tupel zurückgreifen – aber es geht hierbei um die Idee und ich möchte vor allem gezeigt haben, wie einfach Sie solche Konzepte später selbst werden umsetzen können.

Doch nun zurück zu den Optionals, die Swift zur Verfügung stellt:

Will man an den Wert eines Optionals heran, spricht man in bestem Denglisch davon, dass das Optional zunächst ge-unwrapped werden muss. Und das geht auf dreierlei Weise.

Kapitel 2.9.3: Optionals sind Wrapper

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.