Kapitel 2: Grundlagen / 2.9 Optionals / 2.9.2 Ein Beispiel für Optionals

Da die Apple Frameworks wie Foundation oder Cocoa in Objective-C geschrieben sind und innerhalb dieser Sprache der Wert nil – wie ja bereits besprochen – selbstverständlich von allen Objekt-Typen angenommen werden kann, geben viele Funktionen dieser Frameworks reguläre Werte zurück, sofern sie erfolgreich ausgeführt werden konnten, oder nil, falls nicht.

Der Rückgabewert hat also zwei Aufgaben: Darüber zu informieren, ob eine Funktion erfolgreich war oder nicht, und falls ja, das Ergebnis zu liefern.

Diesem Grundprinzip ist Apple bei Swift treu geblieben – sicherlich auch, da die Frameworks nun einmal vorliegen und Apple sie nicht extra für Swift neu schreiben wollte. Da normale Swift-Typen die beschrieben Doppelaufgabe aber nicht erfüllen können, werden bei Bedarf Optionals als Rückgabewerte verwendet.

Dies kann zu Verwirrungen führen, denn oftmals ist klar, dass eine Funktion z.B. einen Integer zurückgibt, aber nicht, ob das ein Int oder ein Int? ist. Hier hilft ein Blick in die API-Spezifikation, Auswendiglernen oder Raten, denn der Compiler wird einen Fehler im Zweifel anzeigen.

Ein gutes Beispiel für die sinnvolle Verwendung eines Optionals ist die Umwandlung eines Strings nach Integer: Der Typ String hat eine Methode namens toInt, die den im String enthaltenen Wert in einen Integer umwandelt. Dies kann gelingen, wenn der String z.B. den Wert „1024“ enthält, oder fehlschlagen, falls er z.B. den Wert „Dies ist gar keine Zahl.“ beinhaltet.

Der Rückgabewert dieser Methode ist dementsprechent Int? und nicht Int, hier der Quellcode:

var einString: String = "1024"
var einOptionalerInteger = einString.toInt()
println(einOptionalerInteger)

einString = "Dies ist gar keine Zahl"
einOptionalerInteger = einString.toInt()
println(einOptionalerInteger)

Dies führt zu der Ausgabe:

Optional(1024)
nil

Die Punktnotation in einString.toInt() habe Sie bereits an mehreren Stellen dieses Kurses gesehen, meist hat sie allerdings eine Eigenschaft des Objekts bezeichnet, zum Beispiel Int.max den in einem Int maximal speicherbaren Wert oder captain.name um den Einzelwert mit der Bezeichnung name aus dem Tupel captain auszulesen. In diesem Fall bezieht sich .toInt() jedoch nicht auf eine Eigenschaft von einString, sondern auf eine ausführbare Methode von einString. Erkennen können Sie das an den abschließenden runden Klammern, die außerdem noch anzeigen, dass .toInt() keine Parameter benötigt, denn diese stünden sonst innerhalb dieser Klammern. Details dazu aber erst später, wenn es um Klassen geht.

Hier ist wichtig zu beobachten, dass die Variable einOptionalerInteger zunächst den Wert 1024 enthält und dann den Wert nil.

Aber bereits die Ausgabe als Optional(1024) anstelle von schlicht 1024 macht deutlich, dass wir für den Umgang mit Optionals Wege benötigen, sie bei Bedarf in ihre nicht optionalen Geschwistertypen umzuwandeln. Um besser zu verstehen, was bei dieser Umwandlung geschieht, müssen wir jedoch zunächst beleuchten, wie die Geschwistertypen technisch zueinander stehen.

Kapitel 2.9.2: Ein Beispiel für Optionals

Schreibe einen Kommentar

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