Zwei Variablen mit eigenem Operator vertauschen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zwei Variablen mit eigenem Operator vertauschen

    Liebe Community,

    um zu zeigen, dass Swift nicht so schlecht ist, wie viele glauben, hab ich folgendes Code Snippet geschrieben, um zwei Variablen zu vertauschen. Die Verwendung im weiteren Verlauf ist dann ganz zuvorkommend.

    Deklaration und Implementierung

    Quellcode

    1. operator infix <> {}
    2. @infix @assignment func <> <T> (inout left: T, inout right: T) {
    3. let temporaryLeft = left
    4. left = right
    5. right = temporaryLeft
    6. }

    Verwendung

    Quellcode

    1. var x = 0
    2. var y = 1
    3. x <> y

    Da es mit Generics implementiert ist, sollte das nicht nur mit Ints funktionieren. Ich hoffe jemandem damit geholfen zu haben. :)

    Mit freundlichen Grüßen

    TheFuriousLion

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von TheFuriousLion () aus folgendem Grund: Neuer Titel

  • Na, ja. Da bleibe ich lieber bei C und Co.

    Quellcode

    1. ​#if !defined(SWAP)
    2. #define SWAP(A, B) do { __typeof__(A) __temp = (A); (A) = (B); (B) = __temp;} while(0)
    3. #endif


    SWAP ist dann doch eindeutiger als <>
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • Swift lässt sogar eigene, neue Operatoren zu? Da kann man ja noch mehr Verwirrung mit stiften, als mit reinem Überladen. Der Operator <> ist in SQL und Pascal der Test auf Ungleichheit.

    TheFuriousLion schrieb:

    um zu zeigen, dass Swift nicht so schlecht ist, wie viele glauben, hab ich folgendes Code Snippet geschrieben, um zwei Variablen zu vertauschen.

    Da ist Dein Beispiel aber nicht unbedingt geschickt gewählt. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Da kommen mir gleich lustige Gedanken....

    Deklaration und Implementierung

    Quellcode

    1. operator infix +1 {}
    2. @infix @assignment func +1 <T> (inout left: T) {
    3. left+=2
    4. }


    Verwendung


    Quellcode

    1. var x = 0
    2. x=x+1


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • mika schrieb:

    Quellcode

    1. #if !defined(SWAP)#define SWAP(A, B) do { __typeof__(A) __temp = (A); (A) = (B); (B) = __temp;} while(0)#endif
    Wieso hast du nicht eine Objektive-C Methode oder Funktion dafür erstellt?

    matz schrieb:

    Wenn mir Objective-C besser gefällt, kann Swift noch so toll sein ;)
    Wenn dir Objektive-C besser gefällt, dann ist das gut. Zudem kommen deine guten Programmierkenntnisse in Objective-C. Ich habe nur Objective-C Grundkenntnisse, weshalb ich mich dafür entschied, Swift zu lernen. Ein Wayne Gretzky Zitat war daran nicht unbeteiligt: "I skate to where the puck is going to be, not where it has been."

    macmoonshine schrieb:

    Da kann man ja noch mehr Verwirrung mit stiften, als mit reinem Überladen. Der Operator <> ist in SQL und Pascal der Test auf Ungleichheit.
    Natürlich kann man damit Verwirrung stiften, aber das kann man mit allem. Man könnte den einfachsten Code unnötig kompliziert schreiben, sodass sich niemand mehr auskennt. Das sagt nichts über eine Sprache aus. Ich kenne weder SQL noch Pascal, aber wenn man mehrere Programmiersprachen kann, muss man doch auch Umdenken, da verschiedene Sprachen verschiedene Probleme unterschiedlich lösen. <> oder Ähnliches wird oftmals verwendet, um einen Tausch zu symbolisieren. Daher sollte man sich fragen, warum SQL und Pascal nicht ebenfalls != als Not-Equal-To-Operator verwenden.

    Ich finde man sollte Swift nicht vornherein als schlecht abstempeln. Ganz nüchtern betrachtet finde ich, dass obiges Beispiel, oder allgemein das Erstellen eigener Operatoren, ziemlich cool ist und somit hat es für mich Existenzberechtigung.
  • Claus,

    es werden nur bestimmte Zeichen zugelassen (/ = - + * % < > ! & | ^ . ~).

    Was ich so mitbekommen habe, ist Swift für dich momentan uninteressant, ich möchte es aber für Swift-Interessierte nicht falsch stehen lassen: In diesem Fall wäre es anstatt infix postfix, da der Operator nach einer Variable vorkommt. Prefix wird verwendet, wenn der Operator davor erscheint und infix für Operatoren zwischen zwei Variablen.
  • TheFuriousLion schrieb:

    Ich finde man sollte Swift nicht vornherein als schlecht abstempeln. Ganz nüchtern betrachtet finde ich, dass obiges Beispiel, oder allgemein das Erstellen eigener Operatoren, ziemlich cool ist und somit hat es für mich Existenzberechtigung.

    Das erscheint Dir nur deshalb so cool, weil Operatoren in den meisten Programmiersprachen unveränderlich sind. Dein Beispiel ist ja bereits ein Beispiel für die Verschleierung der Symantik: Du denkst Dir einen Operator aus, der ungefähr das erahnen lässt, was er macht. Das ist syntaktischer Hokuspokus und Augenwischerei. Wenn jemand anderes Deinen Code lesen muss, wird der arge Probleme bekommen. Selbstdefinierte Operatoren sind Verwirrung pur. Ein Funktionsname sagt vielmehr aus.

    Übrigens ist das mit selbstausgedachten Operatoren ein alter Hut. Die gibt's beispielsweise in Postgres schon seit Urzeiten. Da nutzt sie jedoch so gut wie niemand, auch wenn sie da wahrscheinlich nicht so verheerend wie in Swift sind.

    Ich stempele übrigens Swift nicht schlecht ab. Das würde nämlich bedeuten, dass ich ein Vorurteil gegen diese Sprache hätte. Es gibt allerdings einiges an der Sprache zu kritisieren (z. B. eigene / überladene Operatoren, Optionals), und was ich da sage, beruht auf Fakten.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Wenn jemand anderes Deinen Code lesen muss, wird der arge Probleme bekommen. Selbstdefinierte Operatoren sind Verwirrung pur. Ein Funktionsname sagt vielmehr aus.
    Da geb ich dir voll und ganz Recht. Besser wäre es, wenn Apple obigen Operator als Standard implementiert hätte, für solche Austauschaktionen. Dann würde es auch niemanden mehr verwirren, da man den Operator einfach mit den anderen mitlernt. Aber das ist nur Wunschdenken meinerseits.

    macmoonshine schrieb:

    Ich stempele übrigens Swift nicht schlecht ab. Das würde nämlich bedeuten, dass ich ein Vorurteil gegen diese Sprache hätte. Es gibt allerdings einiges an der Sprache zu kritisieren (z. B. eigene / überladene Operatoren, Optionals), und was ich da sage, beruht auf Fakten.
    Das glaub ich dir gern. Mich darf man sowieso nicht als Referenz heranziehen. :D
  • TheFuriousLion schrieb:

    Besser wäre es, wenn Apple obigen Operator als Standard implementiert hätte, für solche Austauschaktionen. Dann würde es auch niemanden mehr verwirren, da man den Operator einfach mit den anderen mitlernt. Aber das ist nur Wunschdenken meinerseits.

    Was, echt? Neee. Ich frage mich gerade, wann ich solch eine Operation in den letzten Jahren mal im echten Leben benötigt hätte. Ich glaube nie. Auf jeden Fall nicht oft genug, um mir einen Operator dafür zu wünschen oder zu merken. Hast Du so etwas irgendwann mal in nennenswerter Anzahl gebraucht?
    Multigrad - 360°-Produktfotografie für den Mac
  • zerm schrieb:

    N.B. std::swap verwende ich andauernd.
    Ja? Wofür? Bei mir verhält es sich ebenso wie bei mattik.

    Jedenfalls ist

    Quellcode

    1. void swapfunction( id a, id b)
    2. {
    3. id c = a;
    4. a = b;
    5. b = c;
    6. }


    jetzt auch nicht viel komplizierter.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • manoh schrieb:

    mattik schrieb:


    ... Ich frage mich gerade, wann ich solch eine Operation in den letzten Jahren mal im echten Leben benötigt hätte. Ich glaube nie. ...


    Vllt. als Du mal selber eine Sortierfunktion für ein Array geschrieben hast?¿? Für etwas anderes braucht man das eher selten.

    Das letzte Mal im Grundstudium, um Sortieralgorithmen durchzukauen. Gibt es sonst noch einen Grund, sowas selbst zu schreiben?
    Multigrad - 360°-Produktfotografie für den Mac