Swift 2 lernen

Eine Methode für alles

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
So nutzen Sie Funktionen für Eingangsparameter unterschiedlichen Typs auch ohne Überladung: Der generische Typ, üblicherweise T, hilft nicht nur dabei, möglichst wenig Quelltext schreiben zu müssen.
09:20

Transkript

Swift bietet geradezu ein Füllhorn von neuen Möglichkeiten, sich als Programmierer zu verwirklichen, und einen der mächtigsten Bausteine, nämlich Generics, die wollen wir uns hier gemeinsam anschauen. Es ist nämlich jetzt mit Swift möglich, Code zu schreiben, der auf alle Datentypen automatisch angepasst wird. Schreiben wir uns doch eine Funktion, um etwas zu vertauschen - vertausche. Diese Funktion bekommt zwei Argumente, als inout-Parameter, ein a vom Typ Int, ein inout b vom Typ Int. Noch liefert diese Funktion nichts zurück, aber sie vertauscht zwei Werte, und da dürfen wir natürlich unsere Tupel-Syntax verwenden und sagen: Aus (a, b) wird (b, a), dann müssen wir ja hier nicht mehr mit einer temporären Variablen arbeiten. Wir machen uns also eine Variable einA vom Typ Integer = 42, und wir machen uns eine Variable einB, auch vom Typ Integer mit 17, und wenn wir vertauschen, einA mit einB und danach einA und einB noch einmal ausgeben, sehen wir eben, das was vorher noch 42 war, ist dann 17 und so weiter. Klar, das ist ein klassischer Swap. Nun ist das sehr schön, wie wäre es denn, wenn wir Folgendes hätten: Dass wir sagen, nameA soll ein String sein, das ist der Willi, und nameB ist auch ein String, ist unser Testkunde, und wir wollen doch auch einfach vertauschen, den Namen A mit dem Namen B, und danach nameA und nameB noch einmal ausgeben. Ja, und wir sehen schon, da gibt es ein Problem. Denn vertausche: String is Not identical to Int Ja, da hat der Bursche auch Recht, denn die Funktion, die wir geschaffen haben, haben wir ja für Integer geschaffen. Gut, dann könnte man natürlich hergehen und sagen, ja, wir machen uns noch eine Funktion vertausche, die bekommt allerdings hier Strings rein, so. Und dann funktioniert das, und was vorher als nameA noch Willi war, ist danach ein Testkunde, und was vorher Testkunde war, ist jetzt unser Willi geworden. Aber wir sehen schon, hm, bringen wir halt jede Menge Implementierungen ins Spiel, und normalerweise sind unsere Funktionen nicht so einfach, dass sie sich mit einer Zeile Source darstellen lassen, sondern hier werden Webserver aufgerufen, Datenbanken erzeugen Werte und so weiter. Algorithmen werden ausgeführt, und das immer duplizieren zu müssen, nur weil wir verschiedene Eingangsparameter haben, das ist natürlich sehr sehr umfangreich. Wenn auch schön hier zu sehen ist, dass wir in Swift mit Methoden, mit anderen Argumenten auch überladen dürfen, und unter selbem Namen sucht sich der Compiler dann schon heraus, welche Methode für ihn hier die Richtige ist, ein sehr elegantes Sprachfeature. Aber ganz generell, was haben wir denn, wenn wir jetzt noch Doubles und Floats und Bools und Arrays und Dictionaries vertauschen wollen, wir hätten ja hier einen Wust von Vertausche-Funktionen. Dementsprechend gibt es hier ein, - ja, eine ganz wunderbare Geschichte, (lacht), um nicht zu sagen magisch, und wir dürfen also etwas vertauschen, aber richtig, als Funktion machen, und wir sagen hier, ich weiß nicht, welchen Typ der Benutzer als Variablen hat, wir geben hier einfach mal einen Typ an. und wir sagen, wir bekommen dann Argumente, inout a:EinTyp, ein a, das ist so ein Typ, und wir bekommen auch inout b:EinTyp, ein b, das ist auch so ein Typ, und wir lassen hier nach wie vor über ein Tupel uns einmal vertauschen, Jetzt rufen wir auf: vertauscheAberRichtig, und geben ein a ein und ein b, und wir werden auch hier unten vertauscheAberRichtig mit unseren Strings machen, und stellen fest, es funktioniert! Ich kann also dieses vertauscheAberRichtig mit allem Möglichen füttern, mit Strings, mit Integern, mit Doublen, was auch immer ich will, und morgen noch mehr, ohne dass ich hier jemals wieder eine neue Funktion schreiben müsste. Nun ist das hier mit diesem EinTyp natürlich möglich, aber etabliert hat sich zu sagen: das ist T, und auch dieses hier sind dann alles diese Typen T. Das Schöne ist, dass, wenn ich das auf einen Typ festlege, ich auch sagen kann, die Funktion soll mir noch etwas von diesem Typ zurückliefern. Ich könnte ja sagen, ich hab die Definition vertauscheAberRichtig so zu verstehen, dass eben a mit b vertauscht wird, das neue a will ich aber gleich auch als Return-Wert haben. Also können wir sagen, diese Funktion liefert auch ein T zurück, und dann müssten wir halt sagen, okay, das was auch immer das neue a ist, das liefere ich zurück. Und damit ist das natürlich wesentlich mächtiger, als sich hier zum Beispiel auf ein Any oder AnyObject herauszureden, bietet ähnliche Funktionalität, gebe ich auch zu, hätten wir mit inout als AnyObject von den Typen machen können, aber schon garantiert nicht mehr, wenn wir einen bestimmten Typ zurückgeben wollen. Und jetzt haben wir es tatsächlich so, dass ich auch hier sagen kann, let newA = vertauscheAberRichtig, und wenn wir dieses newA ausgeben, dann ist es eben jetzt der Testkunde, wo es ja vorher noch der Willi war. weil vertauscheAberRichtig uns etwas liefert, und die Frage ist, was wird uns hier geliefert, es wird uns tatsächlich auch ein String geliefert. hier auch in der QuickHelp zu sehen, von dem was wir hineingeben, diesem T, bekommen wir auch ein T zurück, das heißt ganz klar, newA ist ein String, und nicht etwa ein Any oder ein AnyObject. Natürlich sieht das mächtig aus für Einsteiger, wenn man sich hier mit diesen sogenannten "Generics" einmal anfreunden will, gerade weil immer von T und so die Rede ist, aber wenn man das wirklich nur als Platzhalter versteht, und sagt, na ja, das kann ein Int sein oder ein String sein, es ist aber auf jeden Fall eines: irgendein Typ, und dann muss a und b eben von diesem Typ sein, und wenn a und b von diesem Typ ist, dann darf die Funktion ja auch ein Element von diesem Typ zurückliefern, nämlich das a. Und ob das ein String, ein Double, ein Float, ein Kunde, ein Artikel, eine Bildbeschreibung, ein Login-Datensatz, was auch immer ist, spielt überhaupt keine Rolle. Generischer Code durch Generics, gehen weit über Möglichkeiten hinaus, die wir mit Any und AnyObjects schon haben, und sind schlicht und einfach fantastisch und großartig, dass wir so etwas in unserem Arsenal haben als Programmierer, Danke, Apple, Danke, Swift!

Swift 2 lernen

Erkunden Sie die wichtigsten Sprachmerkmale von Swift und ihre modernen Eigenschaften wie Generics, Extensions, Tupels und Optionals.

4 Std. 2 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!