Apple Swift: A Swift Tour

So, da bin ich wieder, wie versprochen hier jetzt der erste Teil meiner Analyse von Swift. Ich sage hier nochmal ausdrücklich, das hier bezieht sich auf das erste Kapitel „A Swift Tour“, ergo werden hier evtl. Dinge gesagt, die in späteren Kapiteln verbessert oder geändert werden.

Gut, fangen wir mal an.

Script?

Was mir ja so gar nicht liegt, ist diese Script-Mechanik, wie sie viele funktionale Sprachen haben, so ganz ohne klaren Einstiegspunkt, etc.. Was ist, wenn ich mehr als eine Sourcedatei habe, wo startet mein Programm dann? Ist einfach nicht so meine Welt, aber vllt. bin ich durch Java und C# etwas verhunzt was das angeht. Ich sollte mir mal mehr funktionale Sprachen ansehen, vllt. werde ich dann damit mal warm. Blicke ja schon seit ewig und drei Tagen auf Dylan, aber den Compiler habe ich bisher nicht ans Laufen gebracht. Aber ich schweife ab, hier soll es um Swift gehen, nicht um Dylan (Kommt vllt. irgendwann mal).

println()

Okay, eine einfache Ausgabefunktion, schön und gut. Immer da, ohne weiteren Import, okay kann man machen. Finde aber, das knüpft Swift-Programme stark an die Shell. Bei C (wobei es hier auch nicht ohne Import geht) ist das okee, da es ja eine allg. Sprache ist, die relativ nativ läuft und was ist nativer als eine Shell? Swift hingegen ist ja eig. dazu gedacht, ObjC abzulösen und somit primär für Desktop-Applikationen von OSX und iOS da. Hier werden dann natürlich Ausgaben auf der Shell zweitrangig. Dies gilt gerade für iOS, wo man keine lesbare Shell hat, ohne das Gerät an einen herkömmlichen Computer anzuschliessen. Deswegen finde ich es echt befremdlich, eine so einfache Shell-Ausgabefunktion, die allgegenwärtig ist, zur Verfügung zu stellen. Es vereinfacht nur die Einstiegshürde, weil hey, schau mal, ich mache ein HelloWorld! in einer Zeile, ich kann Swift programmieren! Ich finde es zwar nützlich für Einsteiger, aber irgendwie finde ich es auch komisch.

String Escape

Wer hatte es nicht schonmal. Zb. Java:

int propertyA = 3;
int propertyB = 5
void String toString() {
     return "Ein String" + propertyA + propertyB;
}

Was genau bekommen wir? „Ein String 35“ oder „Ein String 8“? Muss ich es klammern? Oder nicht? Macht es einen Unterschied, Leerzeichen zwischen Variablennamen und Operator zu lassen? Ist der + Operator definiert mit impliziter Konvertierung (Object->String) mit dem String als 1. oder 2. Summand? Ich kann es mir nicht merken und probiere jedesmal aufs Neue aus. Ich finde die Idee gut, ein String Escape zu haben, in dem man rechnen kann.

let propertyA : Int = 3
let propertyB : Int = 5
func toString() -> String {
     return "Ein String \(propertyA)\(propertyB)"
     return "Ein String \(propertyA + propertyB)"
}

Dadurch hat man eine definierte Vorgehensweise, und all diese Verwirrung hört auf. Bitte Java, tu was dagegen. Und nein, String.format ist keine Lösung dafür. Ich mag String.format zwar gerne und habe mir angewöhnt, es zu benutzen, aber für so kleine Sachen ist es doch etwas overhead, finde ich.

Listen und Maps

Einfach mal spontan Listen erzeugen mit [item1, item2, item3] finde ich richtig gut. Wie oft braucht man doch eine Liste mit einem einzigen definierten Element, da die Funktion, die man benutzen will, nur mit Listen arbeitet. Und das auch noch mit maps zu machen. Nettes I-Tüpfelchen. Diese mit dem [index] accessor zu haben, finde ich auch viel besser, als Javas Krankheit mit den get-Methoden. Es fühlt sich halt natürlicher an, da man es ja von den Arrays so kennt.

foreach

So, kommen wir zu for-Schleifen. Zur klassischen Zählschleife habe ich nicht viel zu sagen, die ist ja fast überall gleich. Mir geht es gerade um die foreach. Ich finde weder C# noch Java machen es konsequent. Java benutzt Schlüsselwörter (extends/implements) für die Ableitungen, aber den „:“ Operator, um Listen anzusteuern. C# macht es andersrum, und benutzt den „:“ Operator für Ableitungen (Ist ja immer noch C/C++) und das „in“ Schlüsselwort für Listen. Ich persönlich bin ein Fan von Schlüsselwörtern. Warum nicht extends und implements und for(x in list)? Swift verhält sich hier btw. wie C#, aber naja ist halt auch C/C++. Bin ja froh, dass niemand den Type::Method operator benutzt um zu definieren, für welche Ableitung man jetzt Dinge tut…*hust* Java8 *hust*.

Type? -> Nullable

Okay, explizit definieren zu müssen, ob etwas null oder nil sein kann, kann man drüber streiten. Klar, wenn man Java programmiert, muss man eben darauf gefasst sein, dass alles, was man bekommt, evtl. null sein kann. Ich finde, es schadet nicht, daran aber auch erinnert zu werden durch ein ? am Datentyp.
Die Prüfung auf nil mit if let x = nullableVar zu machen, finde ich nicht so gut gelöst, es ist unleserlich meiner Meinung nach. Mich stören schon so Konstrukte wie while(int buffersize = readBuffer() != 0){ //doStuff }. Ist recht abartig und unverständlich. Klar, die wollten keine implizite Typ-Konvertierung mehr haben. Und diese int gegen 0 Testungen. Aber könnte man bei Nullables nicht die Ausnahme machen, dass diese den Wahrheitswert haben, ob sie nil sind oder nicht? À la

let x : Int? = nil
if(x) {
    //x is not nil
} else {
    //x is nil
}

Wäre jetzt mal so nen Vorschlag.

switch case

Klar, das Durchfallen von cases ist praktisch, und echt ein nettes Konstrukt. Aber mal im Ernst, wie häufig benutzt man switches mit durchfallenden cases im Vergleich zu denen ohne? Macht es da dann nicht mehr Sinn, das break am Ende jedes cases wegzulassen, und multiple cases zu machen. Und voilà, Swift macht es. Gut, aber dann bei enums zu meckern, dass nicht alle Möglichkeiten mit cases abgedeckt sind, wenn man kein default case hat. Ob das so sein muss? Aber grundlegend ist der Ansatz sehr gut. Und dass man richtige Bedinungen machen kann, wie case let x where x.propertyA = 5 finde ich auch gut, da es übersichtlicher ist, 2 nahezu gleiche cases zu haben, wo nur einzelne Details anders sind, als ein großes case mit if-Anweisungen drin. Dass hier jetzt zwingend dieses let mit drin sein muss, finde ich ähnlich unsinnig, wie bei den if let Anweisungen. Warum muss ich für den neuen Kontext eine neue konstante Variable anlegen mit dem Inhalt der alten? I don’t get it, sorry.

foreach auf maps

Ohh endlich, wie bescheuert war das bisher in anderen Sprachen. Erst über die keys iterieren, und dann damit die values ansteuern, oder über KeyValuePair Tuple iterieren und sich da dann die Daten herrausziehen. Endlich einfach mal einen Identifier für den key, und einen für das value angeben, und los.

for range

Die Möglichkeit, eine Zählschleife mal eben wie eine foreach schnell zu schreiben, ist ja ganz nett. Aber wie gibt man die Range an. 1..3 ist das jetzt 1 bis 3 inklusive oder exklusive der 3? Swift löst es eben mit min..max+1 oder min…max. Oder wie sie es nun haben min..<max+1 und min…max. Ich finde es immernoch suboptimal. Warum überhaupt beides? Und warum nicht mit einem selbstsagenden operator. Wie min..<max+1 oder min..=max. Idee finde ich super, Umsetzung ist semigut.

funcions

So, endlich mal bei den Funktionen angekommen. In Swift sind Funktionen first class types, was bedeutet, dass Funktionen nicht zwingend an ein Objekt gebunden sind. Sie können daher einfach stateless benutzt werden. Zusätzlich können sie aber auch innerhalb einer Klasse als Methoden benutzt werden. Somit können dort Funktionen state-abhängig bzw. -verändernd sein. Dieses Konzept liegt mir nicht so, aber das liegt wohl auch daran, das ich noch nie richtig damit gearbeitet habe. Das Einleiten mit func ist okee, zwar ungewohnt, aber da es ja first class types sind, ist das wohl berechtigt. Klassen werden ja auch mit class eingeleitet. Klar könnte man es auch ausschreiben, aber gut. Dass man den Returntype mit func a() -> ReturnType angibt, finde ich irgendwie gut, kann aber nicht genau sagen, warum. Es gefällt einfach.
Die Tatsache, dass man Tuple einfach als Rückgabewerte haben kann, ist die nächste Neuerung, die echt klasse ist. Klar kann man das in Java und C# auch machen, aber da gibt es nur Wrapper dafür. Hier funktioniert es out of the Box ohne Zusätze.
Dass man wie in vielen anderen Sprachen variable Parameterlisten mit am Parametertyp definiert, finde ich inkonsequent gegenüber der range definition der for-Schleife.

Closures

Naja, unbenannte Funktionen, was soll man dazu groß sagen. Die notation

{
     (paramA:String, paramB:String) -> String in
     return "\(paramA) \(paramB)"
}

finde ich etwas übertrieben. Überall wo man ein Closure verwendet, ist der Rückgabewert bekannt, sowie auch die Parameter Typen. Warum es dann noch explizit beschreiben? Aber man kann es ja abkürzen.

{
     (paramA, paramB) in
     "\(paramA) \(paramB)"
}

Und wenn es nur eine einzelne Anweisung ist, kann man sich das return auch sparen. Und es geht auch noch kürzer.

{"\($0) \($1)"}

Das finde ich aber doch etwas übertrieben, und auch vollkommen unlesbar.

Das war der erste Teil, der zweite wird von Klassen handeln, aber immer noch das 1. Kapitel thematisieren.

[Teil 2]

Advertisements

Apple Swift: Ankündigung

Ich hab mir überlegt den Plan mit der Meinung über Apples neue Programmiersprache doch mal umzusetzen. Werde hier also nach und nach die Kapitel des Buches The Swift Programming Language entlang hangeln. Denke es wird dann über jedes größere Thema einen eigenen Post geben. Daher kann es vorkommen das ich meine einzelnen Meinungen in späteren Posts ändern können, da ich ja nach und nach erst auch das Buch lesen werde. Ich werde versuchen natürlich in den späteren Posts darauf hinzuweisen das ich „früher“ wohl einen falschen/anderen Eindruck hatte. Okay, dann mal sehen wie das hier so weiter geht.

Steam Support

So, hallo erstmal, ich wollte schon seit geraumer Zeit anfangen zu bloggen, bisher wusste ich aber noch nicht über was. Meine erste Idee war, mir mal Apple’s neue Programmiersprache anzuschauen und die Welt wissen zu lassen, was ich daran gut finde und was nicht. Aber ich konnte mich nicht dazu durchringen, das wirklich mal zu machen. Nun ist mir aber eine nette Sache mit dem Steam Support von Valve passiert, zu der ich gerne den Inhalt der Mails veröffentlichen würde. Alles was hier so steht ist 1:1 aus den Mails entnommen, bis auf die sensiblen persönlichen Daten, diese sind verfälscht.

1 Nachricht von Ihnen – Tue, 1st Jul 2014 2:57 am

Hallo, ich kaufte am 13.05.2014 Guns of Icarus Online Collectors Edition 4-Pack eine version für mich 3 weitere zum Giften. Da ich aber 4 Interessierte Freunde habe, kaufte ich am 28.06.2014 eine Weitere Kopie. Nun habe ich aber nur 3 Kopien in meinem Inventar stehen. (Habe heute am 01.07.2014 diese 3 Kopien verschenkt, für den Fall das diese nicht mehr da sind wenn Sie das kontrollieren wollen) Nun meine Frage: Warum habe ich keine 4. Kopie zum verschenken da ich doch 5 stk. insgesamt gekauft hatte. Die PayPal Transaktionscodes: 4-Pack: <17-stellige PayPal TransaktionsID> Single: <17-stellige PayPal TransaktionsID> anbei ein Screenshot meiner Shoptransaktionen. 130f5-shoptransaktionen

2 Nachricht von Cannon – Tue, 1st Jul 2014 8:33 am

Hallo TyWuNon, vielen Dank für Ihre Nachricht an das Steam Support Team. Bitte loggen Sie sich in Ihren Steamaccount ein und gehen Sie zu Spiele > Geschenke und Besucherpässe verwalten. Sie werden nun zu Ihrem Inventar weitergeleitet und sollten Ihre verfügbaren Geschenke sehen, welche Sie erneut an einen Steamaccount oder eine E-Mail Ihrer Wahl weiterverschicken können. Der Empfänger wird darauf eine E-Mail Bestätigung erhalten, damit er sein Geschenk einlösen kann. Bitte geben Sie uns Bescheid, falls das Problem dennoch weiterhin bestehen sollte. Bitte beachten Sie auch den folgenden Link für weitere Informationen: Title: Steam Gifts Link: http://support.steampowered.com/kb_article.php?ref=6262-QXCN-0755

Beste Grüße,
Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.

3 Nachricht von Ihnen – Tue, 1st Jul 2014 11:18 am

Nein es ist weiterhin nicht in meinem Inventar.

4 Nachricht von Cannon – Wed, 2nd Jul 2014 9:13 am

Hallo, Alle Viererpakete („Four Packs“) beinhalten drei Geschenke sowie ein Spiel für Ihren eigenen Account.
Falls dieses Spiel bereits auf Ihrem Account registriert wurde, können Sie das Four Pack deshalb nicht kaufen, auch wenn Sie vier Spiele als Geschenk versenden möchten. Beste Grüße, Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.

5 Nachricht von Ihnen – Wed, 2nd Jul 2014 10:08 am

ja das ist klar das das 4-pack eine version für mich und 3 zum verschenken beinhaltet. aber wie im Screenshot gezeigt habe ich deswegen eine weitere einzelne kopie gekauft um eine 4. verschenk kopie zu haben. genau diese ist meinem gift Inventar nicht gutgeschrieben worden. jedoch hat paypal den betrag dafür abgebucht.

6 Nachricht von Cannon – Thu, 3rd Jul 2014 4:36 am

Hallo TyWuNon, bitte schließen Sie Steam und öffnen Sie Ihr Steam Installationsverzeichnis (meist C:\Programme\Steam). Löschen Sie alle Dateien !AUSSER! folgender Datei: Steam.exe und !AUSSER! folgenden Verzeichnissen: \SteamApps\ und \Userdata\ Ordner starten Sie dann Ihren Computer neu. Bitte starten Sie Steam danach aus dem Steam Installationsverzeichnis und nicht über die bereits vorhandene Verknüpfung. Prüfen Sie, ob das Problem erneut auftritt, während Steam ausgeführt wird. Hinweis: Dieser Vorgang hat auf bereits installierte Spiele keinen Einfluss. Beste Grüße, Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.

7 Nachricht von Ihnen – Thu, 3rd Jul 2014 6:17 am

Guten Tag, ich möchte mir ja helfen lassen. Jedoch denke ich nicht das es ein lokales Problem ist. Ich besitze derzeit keinen Aktiven Windows Pc ergo ist diese Vorgehensweise wohl ehh nicht sinnvoll. Ich habe derzeit eigentlich keine aktive Steam Installation laufen auf keiner Plattform. Ausserdem tritt dieses Problem auch auf eurer Internet seite auf. Sowohl auf mobilen Geräten als auch auf meinem Linux Desktop. Also ich sehe hier nur 2 Möglichkeiten der Lösung. Entweder ihr schaltet mir für mein gift Inventar eine weitere Guns of Icarus Collectors Edition frei die ich ja bezahlt habe nur niemals bekommen, oder ihr erstattet mir mein Geld zurück.

8 Nachricht von Cannon – Thu, 3rd Jul 2014 8:15 am

Hallo TyWuNon, bitte befolgen Sie diese Schritte, um Ihre Steam Installation zurückzusetzen: 1. Öffnen Sie ein Terminal-Fenster 2. Geben Sie folgenden Befehl ein: steam –reset 3. Sie sollten anschließend folgende Bestätigung sehen: – Installing bootstrap /home/[username]/.steam/steam/bootstrap.tar.xz – Reset complete! Dieser Vorgang entfernt die existierenden Steam Daten und lädt diese erneut herunter. Starten Sie Steam neu und prüfen Sie, ob der Fehler weiterhin auftritt. Beste Grüße, Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.

9 Nachricht von Ihnen – Thu, 3rd Jul 2014 9:04 am

Okay, ich will ja nicht von mir behaupten das ich nicht probieren würde was mir hier gesagt wird. Und wie erwartet ist der reset durchgelaufen und es hat natürlich nicht funktioniert. Und ich fühle mich etwas verarscht hier. ES LIEGT NICHT AN MEINER STEAM INSTALLATION! Ich habe 5x Guns of Icarus gekauft nur 4 Bekommen 1 für mich 3 Verschenkt. 4. Kopie zum verscheneken ist NIE in meinem Inventar angekommen obwohl wie im Screenshot des ersten Posts zu sehen es in meiner Transaktions liste drin ist und PayPal hat den betrag auch abgebucht. Also habe ich für 5 bezahlt und nur 4 bekommen.

10 Nachricht von Cannon – Thu, 3rd Jul 2014 1:29 pm

Hallo TyWuNon, wie bei vielen Software-Produkten können wir keinen Umtausch und Rückvergütung bei online erworbenen Produkten (siehe Software-Lizenz) gewähren. Bitte lesen Sie dazu auch Abschnitt 3 im STEAM-Nutzungsvertrag für weitere Informationen. Wir können eine Ausnahme bei vorbestellten Spielen machen, wenn wir die Anfrage bis zum Steam-Release-Tag erhalten. Steam Subscriber Agreement http://store.steampowered.com/subscriber_agreement/ Wir können Ihnen aber als einmalige Ausnahme anbieten, das Spiel von Ihrem Account zu entfernen und den Betrag für diesen Einkauf Ihrem Steamaccount als Guthaben hinzuzufügen, damit Sie dieses für weitere Einkäufe verwenden können. Bitte teilen Sie uns mit, ob diese Lösung für Sie in Frage kommt. Beste Grüße, Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.
 
 

11 Nachricht von Ihnen – Thu, 3rd Jul 2014 9:20 pm

Meine frage ist ja nun: meinen sie die Kopie die ich einzeln am 28.06.2014 für mein Gift-Inventar gekauft und niemals erhalten habe? oder die Kopie die meinem Account hinzugefügt wurde als ich am 13.05.2014 das 4er-Pack gekauft hatte. Sollte es MEINE Version aus dem 4er-Pack sein, bin ich NICHT einverstanden. Ich habe schließlich nachweislich eine insgesamt 5. Kopien gekauft aber nur 4 Insgesamt bekommen. Wenn Sie mir jedoch die 4,99€ gut schreiben für den Einzelkauf am 28.06.2014, JA damit bin ich einverstanden. Jedoch werden sie sehen das in meinem Gift-Inventar sich keine weitere Kopie von Guns of Icarus befindet. Was ja mein eigentliches Problem ist. Ich habe nochmals als Bilder angehängt: – Die Shoptransaktionen die besagen das ich 5 Kopien gekauft habe (4er-Pack + 1) – Meinen Geschenkverlauf das ich 3 Kopien verschenkt habe. (die anderen 3 aus dem 4er Pack) – Mein Inventar, wo man sehen kann das keine 5. Kopie in meinem Inventar vorhanden ist. Also nochmal wenn sie mir für den kauf am 28.06.2014 die 4,99€ gut schreiben: JA bitte Wenn sie jedoch die Kopie entfernen wollen die ich am 13.05.2014 durch das 4er-Pack gekauft habe: NEIN, das würde das Problem nicht lösen.

 
 

12 Nachricht von Cannon – Sun, 6th Jul 2014 8:36 am

Hallo TyWuNon,
wir haben Ihnen den betreffenden Einkauf ausnahmsweise als Guthaben hinzugefügt. Sie können dies einlösen indem Sie in Ihrem Steamaccount rechts oben auf den Betrag neben Ihrem Accountnamen klicken. Bitte teilen Sie uns mit, falls es dabei Probleme geben sollte. Weitere Informationen zum Steam-Guthaben finden Sie in folgendem Artikel: Title: Steam Wallet Link: http://support.steampowered.com/kb_article.php?ref=1122-RTSC-0478Beste Grüße, Steam Support Team Bei weiteren Fragen stehen wir Ihnen gerne zur Verfügung.

13 Nachricht von Ihnen – Sun, 6th Jul 2014 12:38 pm

Dankeschön ich habe meine Version behalten und mir wurde das Geld für den Einkauf erstattet. Vielen Dank =)

Mein Fazit: Die vom Support lesen nicht was man denen schreibt und geben dann nur 0815 Antwort Templates raus. Klar sie haben auf halben Wege mitbekommen, dass ich primär unter Linux unterwegs bin, aber das hat die auch nicht dazu bewegt, die eigentliche Information zu verstehen. Zusätzlich finde ich es schon etwas anmaßend, mir zu sagen, joar wir haben dir dein Spiel nicht geliefert, aber es dir nachträglich zu geben oder eine Rückerstattung widerspricht unseren AGB’s, das ist hier jetzt nur eine Ausnahme. Zum Glück ist es jetzt alles geklärt weil man sich doch mal durchgelesen hat was ich schreibe -_- Naja erster Post, etwas Rumgeheule, mal sehen wovon der nächste Post handelt und wann der kommt. *winke*