Warum enums berechnet haben Eigenschaften, aber nicht gespeichert properties in Swift?
Ich bin neu in Swift und kam gerade über diesem in der Dokumentation:
Berechneten Eigenschaften werden zur Verfügung gestellt von Klassen, Strukturen und
Enumerationen. Gespeicherten Eigenschaften sind nur durch Klassen-und
Strukturen.
Warum ist das so? Tun die damit verbundenen Werte für enum zu arbeiten, wie die gespeicherten Eigenschaften? Es scheint, wie Sie gelagert hatten-Eigenschaften anfangs - Warum keine gespeicherten Typ-Eigenschaften für Klassen, die in swift?
InformationsquelleAutor der Frage Adit Gupta | 2015-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
enum
s zu tun haben gespeichert Typ Eigenschaften - D. H.,static
Eigenschaften. Sie haben nicht gespeichert Instanz Eigenschaften. Ich weiß nicht, ob es einen technischen Grund, warum die gespeicherte Instanz-Eigenschaften sind nicht verfügbar fürenum
s. Sie kann Sie bitten, Ihre Frage an das dev-forum, wenn Sie möchten, eine technische Antwort für "warum".In Ihrer Frage, die Sie Fragen, ob die damit verbundenen Werte zu arbeiten, wie die gespeicherten Eigenschaften. In der Tat, Sie tun, und sind flexibler (in mancher Hinsicht) als gespeicherte Eigenschaften für
struct
s undclass
es. Jedercase
in einemenum
können Ihre eigenen, spezialisierten Satz von Daten, der es zugeordnet ist. Anstatt einen Satz von Eigenschaften gespeichert, die für allecase
s, erhalten Sie zu individualisieren, die gespeicherten Einstellungen für die einzelnencase
.InformationsquelleAutor der Antwort Aaron Rasmussen
Enums nicht so dass die gespeicherte Instanz-Eigenschaften ist ein design-Wahl. Mit enum gespeichert Instanz Eigenschaften macht es wie ein struct (mit enum Supermächten), sondern nur von der Art Perspektive nun enums handeln, wie Typ-Multiplikatoren. Im Grunde betrachten
Was dies tatsächlich bedeuten, dass enum
Times
uns ermöglicht, mit einer beliebigen Kombination von Elementen ausSet1
undSet2
was in 6 unterschiedliche Fälle, aber warten Sie, wir wissen, dass das ist eigentlich der Zweck von einem Tupel-Typ wie(Set1, Set2)
woTimes
erklärtIch hoffe, dies dient als eine angemessene Begründung für nicht so dass der erstere Fall.
Dass gesagt wird, swift Enumerationen, die es uns erlauben werden, indem eine beliebige n-Tupel mit jedem Fallso dass uns das zu erklären, was ist bekannt als diskriminiert union in die funktionale Programmierung. Rufen Sie eine gespeicherte Eigenschaft angehängt Fall, wenn Sie mögen. Von den Typen Perspektiven es fungiert nun als type-adder.
Wir haben jetzt 5 verschiedene Fälle. Wenn wir jetzt speichern von 2-Tupeln:
wir jetzt haben im Grunde die Summe der Multiplikation (Set1 * Set2 + Set3 * Set4).
Dies ist ein sehr mächtiges Werkzeug, wenn es um pattern matching.
JEDOCHgibt es einige echte Fälle, wenn Sie wirklich wollen, zu emulieren, die form der gespeicherten-Eigenschaft innerhalb enum. Bedenken Sie:
ist eine deklarative Art und Weise zu definieren, die REST-Endpunkte (im Rahmen, wie Moya)
Wenn Sie möchten, um das Feuer einen Wunsch, Sie möchte etwas tun, wie
Aber nun stellen Sie sich vor, Sie möchten unterscheiden Sie Produktions-und test-server. Wenn Sie einen server hinzufügen, wie ein anderes Tupel-element in jedem Fall:
wird dies eine falsche Semantik, da Sie ursprünglich die Absicht jedes Tupel zu speichern, request-Parameter, aber jetzt speichert es eine server-Basis-Adresse.
Zu vermeiden, Dinge wie diese kann man eigentlich einstellen, unsere Art in der folgenden Weise. Anstatt Server definiert sind, die da sagen:
können wir definieren es mit distinct Typ, für jeden Fall wie:
und schließlich einstellen, unsere Diensttyp als
InformationsquelleAutor der Antwort ambientlight
Benutze ich einen kleinen trick zum speichern Eigenschaften, die nicht barrierearm auf die Initialisierung.
Zuerst erstelle ich eine Klasse
Future
gespeichert wird die gespeicherte Eigenschaft in die Zukunft:Dann erstelle ich mir ein enum:
Instanziieren:
Später im code:
Und später können Sie den Zugriff auf den Wert:
Dies ist nicht etwas, sollten Sie Missbrauch, aber es können in einigen Fällen nützlich sein.
Hoffe, es hilft.
InformationsquelleAutor der Antwort manueGE
Enum ist als ein strukturierter Datentyp, die geändert werden können, ohne sich zu ändern, sagen, ein String oder Int mehrfach in den code und mit einem enum-wir können nie sorgen über das ändern die gleiche Sache mehr als einmal. Zum Beispiel dropdown-Menü:
Mit gespeicherten Eigenschaften kann u vorberechnen benötigten Informationen und reduzieren den code in deiner main-Funktion. Bestes Beispiel ist die Berechnung der Größe der rect-zum Beispiel:
InformationsquelleAutor der Antwort Kristijan Delivuk