Swift 2 lernen

Nicht getypte Arrays

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Hier erfahren Sie, wie es sich mit Any und AnyObject verhält, um mit ungetypten Arrays arbeiten zu können.
08:38

Transkript

Swift ist eine stark typisierte Programmiersprache, so dass wenn wir beispielsweise ein Array erzeugen, wir entweder Integer oder Strings verwalten können, aber nicht beides. Und Swift bringt aber dafür eine Lösung mit, nämlich Any und AnyObject, und wie das Ganze zusammenhängt, schauen wir uns dann hier in diesem Playground einmal in Ruhe an. Ja, das ist quasi ein Joker-Datentyp, für folgende Problemstellung: Wir haben also unsere Daten hier als Array, und ich lege da rein drei Zahlen, also, was haben wir geschaffen? Wir haben geschaffen ein Array von Integern. Und das hätte ich hier schreiben können, funktioniert alles wunderbar, wir dürfen unsere Daten ausgeben, alles ist in Ordnung. Durch die Type Inference wird wiederum das hier automatisch festgestellt, dann dürfen wir es ja auch weglassen. Wie sieht es aus, wenn wir nun ein Array hätten, von rot, blau und gruen? ein paar Farben, auch das ist kein Problem, dann haben wir wohl ein Array von Strings erstellt. Prima. Jetzt möchte ich aber in dem Array zusätzlich noch ein paar Integer speichern, und genau jetzt kommen wir auf ein Problem. Weil Strings und Integer kann ich ja nicht hier über Strings ausdrücken. Gut, dann gehen wir auf den Integer-Teil, hab ich ein Problem. Passen nämlich keine Strings mehr. Jetzt könnte man ja annehmen, dass ich so was sagen dürfte wie: "Ich habe ein Array, und da sind Int's und Strings drin". aber auch das funktioniert so leider nicht in Swift, und dann könnte man ja schon ins Straucheln geraten. Jetzt lass mal doch mal schauen, was passiert, wenn wir keinen Typ angeben. Scheinbar geht es doch, und dann wollen wir doch hier einmal über unsere Elemente iterieren, in unsere Daten werden wir über ein println hergehen und sagen, Element ist gleich Element, so, und haben dann unser println, und auch das wird sechsmal ausgeführt, und klicken wir hier auf die Ausgabe, sehen wir auch, aha, rot, blau, gruen 1, 2, 3 - also er hat tatsächlich hier diese Ausgabe auch gemacht, alles ist in Ordnung, dann stellt sich doch die Frage, was ist denn das jetzt für ein Typ? Ist es String, ist es Int? String und Int ging nicht. Die Lösung dafür ist, es gibt eben diesen Joker-Datentyp, um ihn als solchen mal zu bezeichnen, Any Wir machen uns ein Array von Any, und Any steht als Synonym für jeden Datentyp, den wir als Struktur haben, also in Double-Floats, eigentlich auch Strings, Arrays und Dictionaries, wir wissen, dass das in Swift als Struktur abgelegt ist, und auch für Objekte, also wirkliche Instanzen, die wir uns aus Klassen heraus bauen. Formal gibt es da aber eine Abgrenzung, denn genau Letzteres, diese Instanzen, die aus Klassen erwachsen, sollte man als AnyObject bezeichnen. Nun sehen wir hier aber ganz klar, OK, die Zahl 1 ist ein Int, ein Int in Swift ist als struct definiert, und es greift trotzdem, das heißt, die Trennung ist da nicht ganz so scharf zu verstehen. Also, Any ist unser Joker-Datentyp, ein jedes Element ist auf jeden Fall in Any darstellbar, und so können wir natürlich auch Arrays oder auch Dictionaries aufbauen, deren Schlüssel, oder Werte, oder hier Array-Elemente auch gemischt sein können, sich also von Element zu Element letztendlich unterscheiden. Natürlich müssen wir mit dieser - ja, großen Macht, mit der auch große Verantwortung einherkommt, ein bisschen vorsichtig umgehen, denn wenn wir hier beispielsweise Folgendes haben: Wir haben einen Text, und der Text lautet: "Swift ist eine wunderbare Programmiersprache", was dürfte man auch anderes sagen über Swift, dann haben wir die Möglichkeit, auch Methoden aufzurufen, die so ein String mitbringt, wie zum Beispiel components und dass ich dann sage, lieber Text, components separated by Leerzeichen, und wir lassen uns also diesen String anhand dieser Leerzeichen hier zerlegen in ein Array, und genau dieses Array haben wir dann hier, unsere fünf Elemente. Also ein String bietet diese Methode an, ein String ist doch ein AnyObject, das heißt, wenn ich hier wirklich reinschreiben würde, Text AnyObject funktioniert das Ganze auch! Wunderbar! Nur was passiert denn, wenn ich hergehe, und sage, hier wäre angeblich noch ein Text. Auch das ist ein AnyObject, aber da sagen wir eben doch mal - hm! ist doch nur die Zahl 100. Und wenn wir jetzt hergehen würden, und würden sagen - ähm, weitereComponents, und würden uns von noch einem Text componentsSeparatedByString geben lassen wollen, dann funktioniert das sogar noch im Compiler hier, ich darf also das durchaus schreiben, aber spätestens zur Laufzeit kracht es ganz erheblich, denn - an dieser Stelle ist ja noch ein Text, eben nicht ein String, sondern nur ein Integer. Weil ich aber gesagt habe, es wäre ein AnyObject, stellt uns die Code-Completion und der Compiler, wenn wir so wollen, auch alle Methoden zur Verfügung, die ich nur überhaupt auf irgendein Objekt anwenden kann. Das heißt, wenn wir nicht in dem Playground wären, ich hätte das programmieren können, aber zur Laufzeit stürzt dann unser Programm ganz gewaltig ab, weil ja ein Integer eben nicht diese Methode hat. Hätten wir hier gesagt, noch ein Text ist ein Int, dann hätte uns natürlich der Compiler gleich geholfen, und gesagt, ja, ja, Int hat aber nicht die Methode componentsSeparatedByString. Deshalb, wie eben gesagt, mit großer Macht kommt große Verantwortung einher, also, wenn ich sage, es wäre ein AnyObject, darf ich ja alles schreiben, was auf irgendein Objekt anwendbar ist, es muss dann nur zur Laufzeit sicher gestellt werden, dass das auch funktioniert. Und dementsprechend kommentiere ich das hier mal aus, damit, wenn man das Beispiel öffnet, man nicht gleich mit einer roten Fehlermeldung konfrontiert wird. Also, spannende Sachen, Any und AnyObject, als übergeordnete, ich sage gerne Joker-Datentypen dazu, formal dient Any wirklich nur als Platzhalter für Referenzen, normalerweise Strings, Integers, Doubles, Floats, Bools, und unsere Arrays und Dictionary, AnyObject wiederum soll verwendet werden, für Instanzen, die aus Klassen heraus gebildet werden, das aber Swift da selber im Moment nicht so scharf die Sache sieht, können wir hier beweisen, dass wir unseren Int, der ja über eine Struktur definiert ist in Swift, auch als AnyObject verkaufen können.

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!