Die enum
wäre aus mehreren Gründen bevorzugt.
Zuerst wird die enum
endet tatsächlich mit einem geringeren Speicherbedarf auf. Dies liegt daran, dass Swift enum
Werte in ein einzelnes Byte (egal was der Rohwert ist) optimiert, und wir erhalten nur den vollen Wert davon, wenn wir rawValue
auf dem enum
Wert aufrufen. Fügen Sie den folgenden Code in einen Spielplatz zu sehen:
struct LetterSpacingS {
static let Short: Double = 1.0
}
enum LetterSpacingE: Double {
case Short = 1.0
}
sizeofValue(LetterSpacingS.Short)
sizeofValue(LetterSpacingE.Short)
Die double
ist 8 Bytes, während die enum
nur 1.
Zweitens ist die Bedeutung des ersten Punktes erstreckt sich über nur Speicherbedarf . Dies kann auch für die Ausführungseffizienz unseres Programms gelten. Wenn wir zwei Werte von unserer Struktur vergleichen wollen, vergleichen wir 8 Bytes. Wenn wir zwei unserer Enum-Werte vergleichen wollen, vergleichen wir nur ein einzelnes Byte. Wir haben 1/8 so viele Bytes in diesem speziellen Fall zu vergleichen. Und das ist nur mit einem Doppel. Berücksichtigen Sie, dass Swift-Enums auch eine Zeichenkette als Hintergrundtyp haben können. Der Vergleich von zwei Strings kann außerordentlich teuer sein, wenn man nur das einzelne Byte vergleicht, hinter dem sie in einem enum
versteckt sind.
Drittens die ENUM verwenden, sind wir den Vergleich nicht Gleitkommazahlen, die Sie wirklich nicht wollen, sprechen im Allgemeinen zu tun.
Viertens gibt uns die Verwendung der enum eine Art von Sicherheit, die wir mit der Konstantenstruktur nicht bekommen können. Die ganze Struktur der Konstanten erlaubt es, eine Handvoll vordefinierter Konstanten zu definieren.
Aber wie würde nun eine Methode aussehen, die einen dieser Werte erwartet?
func setLetterSpacing(spacing: Double) {
// do stuff
}
Und nun, was passiert, wenn Joe-Coder in kommt und tut:
foo.setLetterSpacing(-27.861)
Nichts hat ihn zu stoppen. Es braucht ein Double, ein Double. Dies ist vielleicht nicht so häufig, aber wenn Sie sich in einer Bibliothek befinden, die Sie verteilen, lassen Sie sich offen für Fragen und Kommentare wie "Wenn ich einen Wert von 5,0 in passiere, sieht es überhaupt nicht gut aus!"
Aber vergleichen Sie dies mit der Verwendung der enum
.
func setLetterSpacing(spacing: LetterSpacing) {
// do stuff
}
Und jetzt erhalten wir nur die drei vordefinierten Optionen für das, was in dieses Argument übergeben werden soll.
Und außerhalb Ihrer internen Verwendung für die Werte, die von enum
gehalten werden, sollten Sie rawValue
zu viel verwenden.
Der fünfte Grund ist nicht ein starker Grund für eine ENUM über eine Struktur mit, aber meistens nur ein Punkt zu machen, ist einer der Gründe für die Verwendung einer Struktur über eine Enumeration vorgeschlagen zu beseitigen. Schnelle Enums können in anderen Typen geschachtelt werden, andere Typen können in Swift-Enums verschachtelt werden. Sie müssen keine Struktur verwenden, um verschachtelte Typen zu erhalten.
Das war die Antwort, die ich suchte. Ich war vom ersten Tag an über das Thema Gedächtnis und Effizienz überzeugt. Was ist mit diesem '.rawValue' Typ? Die Lösung, die ich von Ihnen sehe, ist die Neuimplementierung von Funktionen, die 'LetterSpacing'-Typen überall verwenden. In meinem Fall wäre das möglich, weil es einfach zu viel zu tun gibt. Ich erkläre nur einige "globale" "bekannte" Werte, die ich verwenden kann, um beim Erstellen meiner Stile auf den Buchstabenabstand Bezug zu nehmen. Ich kann mir nicht vorstellen, dass ich alle Apple-Setter nur aus Gründen der Klarheit reinimplementiere :) –
Im Grunde genommen sollte man '.rawValue' nur verwenden, wenn man es tatsächlich tatsächlich braucht. Basierend auf "LetterSpacing", wenn wir annehmen, dass es sich um eine Textzeichnung handelt, ziehen Sie '.rawValue' nur heraus, wenn Sie den Text tatsächlich zeichnen. Es spielt an keinem anderen Punkt eine Rolle. Für spezifischere Ratschläge, wie man mit '.rawValue' umgeht, müsste jemand spezifischere Beispiele sehen. – nhgrif
Denken Sie daran, @NicolasB., Sie können immer Erweiterungen zu Apple-Klassen schreiben, die Ihre 'LetterSpacing'-Enumeration (die nur einen angemessenen Wert auf Apples Klassen setzt) verwenden, ohne den Apple-Code neu zu implementieren. – nhgrif