Achtung: Laienbedingungen voraus.
Diese Erklärung ist auf der kleinsten Codeebene nicht streng korrekt. Es wurde jedoch von einem Mann überprüft, der tatsächlich an Swift arbeitet, und er sagte, es sei gut genug als grundlegende Erklärung.
Deshalb möchte ich versuchen, die Frage nach dem "Warum" einfach und direkt zu beantworten.
Um genau zu sein: Warum müssen wir Strukturfunktionen so markieren, mutating
als könnten wir Strukturparameter ändern, ohne Schlüsselwörter zu ändern?
Das große Ganze hat also viel mit der Philosophie zu tun, die Swift schnell hält .
Man könnte es sich wie das Problem vorstellen, tatsächliche physische Adressen zu verwalten. Wenn Sie Ihre Adresse ändern und viele Personen Ihre aktuelle Adresse haben, müssen Sie alle benachrichtigen, dass Sie umgezogen sind. Aber wenn niemand Ihre aktuelle Adresse hat, können Sie einfach umziehen, wohin Sie wollen, und niemand muss es wissen.
In dieser Situation ist Swift wie die Post. Wenn sich viele Menschen mit vielen Kontakten viel bewegen, hat dies einen sehr hohen Overhead. Für die Bearbeitung all dieser Benachrichtigungen muss eine große Anzahl von Mitarbeitern bezahlt werden, und der Vorgang nimmt viel Zeit und Mühe in Anspruch. Deshalb ist Swifts idealer Zustand, dass jeder in seiner Stadt so wenig Kontakte wie möglich hat. Dann braucht es kein großes Personal, um Adressänderungen zu handhaben, und alles andere kann schneller und besser erledigt werden.
Dies ist auch der Grund, warum Swift-Leute alle von Werttypen im Vergleich zu Referenztypen schwärmen. Referenztypen bilden von Natur aus überall "Kontakte", und Werttypen benötigen normalerweise nicht mehr als ein Paar. Werttypen sind "Swift" -er.
Also zurück zum kleinen Bild : structs
. Strukturen sind in Swift eine große Sache, da sie die meisten Aufgaben von Objekten ausführen können, aber sie sind Werttypen.
Setzen wir die physikalische Adressanalogie fort, indem wir uns eine vorstellen misterStruct
, in der wir leben someObjectVille
. Die Analogie wird hier ein wenig verwirrt, aber ich denke, es ist immer noch hilfreich.
Um struct
also misterStruct
das Ändern einer Variablen auf a zu modellieren , haben wir beispielsweise grünes Haar und erhalten den Befehl, auf blaues Haar umzuschalten. Die Analogie wird, wie ich bereits sagte, verwirrt, aber irgendwie passiert, dass anstatt die misterStruct
Haare zu wechseln , die alte Person auszieht und eine neue Person mit blauen Haaren einzieht und diese neue Person beginnt, sich selbst anzurufen misterStruct
. Niemand muss eine Benachrichtigung über eine Adressänderung erhalten, aber wenn sich jemand diese Adresse ansieht, sieht er einen Mann mit blauen Haaren.
Lassen Sie uns nun modellieren, was passiert, wenn Sie eine Funktion auf a aufrufen struct
. In diesem Fall ist es misterStruct
so, als würde man eine Bestellung wie erhalten changeYourHairBlue()
. Also gibt die Post die Anweisung: misterStruct
"Ändere deine Haare in Blau und sag mir, wenn du fertig bist."
Wenn er der gleichen Routine wie zuvor folgt und das tut, was er getan hat, als die Variable direkt geändert wurde, misterStruct
wird er aus seinem eigenen Haus ausziehen und eine neue Person mit blauen Haaren hinzuziehen. Aber das ist das Problem.
Der Befehl lautete: "Ändere deine Haare in Blau und sag mir, wann du fertig bist", aber es ist der Grüne, der diesen Befehl erhalten hat. Nachdem der Blaue eingezogen ist, muss noch eine Benachrichtigung "Job abgeschlossen" zurückgesendet werden. Aber der Blaue weiß nichts davon.
[Um diese Analogie wirklich zu etwas Schrecklichem zu machen, passierte dem grünhaarigen Mann technisch gesehen, dass er nach seinem Auszug sofort Selbstmord begangen hat. Also er niemanden mitteilen kann , dass die Aufgabe abgeschlossen ist entweder! ]]
Um dieses Problem zu vermeiden , muss Swift nur in solchen Fällen direkt zum Haus unter dieser Adresse gehen und tatsächlich die Haare des aktuellen Bewohners wechseln . Das ist ein ganz anderer Prozess als nur einen neuen Mann einzusenden.
Und deshalb möchte Swift, dass wir das mutating
Schlüsselwort verwenden!
Das Endergebnis sieht für alles, was sich auf die Struktur beziehen muss, gleich aus: Der Bewohner des Hauses hat jetzt blaue Haare. Aber die Prozesse, um dies zu erreichen, sind tatsächlich völlig anders. Es sieht so aus, als würde es dasselbe tun, aber es macht etwas ganz anderes. Es macht etwas, was Swift-Strukturen im Allgemeinen niemals tun.
Um dem armen Compiler ein wenig Hilfe zu geben und ihn nicht dazu zu bringen, herauszufinden, ob eine Funktion die für jede einzelne Strukturfunktion selbst mutiert struct
oder nicht , werden wir gebeten, Mitleid zu haben und das mutating
Schlüsselwort zu verwenden.
Im Wesentlichen müssen wir alle unseren Beitrag leisten, damit Swift schnell bleibt. :) :)
BEARBEITEN:
Hey Dude / Dudette, die mich herabgestimmt hat, ich habe meine Antwort einfach komplett neu geschrieben. Wenn es besser zu Ihnen passt, werden Sie dann die Ablehnung entfernen?