Verwenden von Xcode 7.3.1 und Swift 2.2
Obwohl ich Martin R zustimme und der Ray Wenderlich-Styleguide deutlich macht, dass Aufzählungen in fast allen Anwendungsfällen besser sind, da es sich um einen reinen Namespace handelt, gibt es einen Ort, an dem struct
Trümpfe verwendet werden enums
.
Anweisungen wechseln
Beginnen wir mit der Strukturversion:
struct StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
Mit einer Struktur wird diese übereinstimmen und ausgedruckt Matched StaticVars.someString
.
Betrachten wir nun die Hüllkurven-Enum-Version (indem Sie nur das Schlüsselwort struct
in ändern enum
):
enum StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
Sie werden feststellen, dass in der switch-Anweisung in der case StaticVars.someString:
Zeile ein Fehler bei der Kompilierung angezeigt wird. Der Fehler ist Enum case 'someString' not found in type 'String'
.
Es gibt eine Pseudo-Problemumgehung, indem die statische Eigenschaft in einen Abschluss konvertiert wird, der stattdessen den Typ zurückgibt.
Sie würden es also folgendermaßen ändern:
enum StaticVars {
static let someString = { return "someString" }
}
switch "someString" {
case StaticVars.someString(): print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
Beachten Sie die Notwendigkeit von Klammern in der case-Anweisung, da es sich jetzt um eine Funktion handelt.
Der Nachteil ist, dass es jetzt, da wir es zu einer Funktion gemacht haben, jedes Mal ausgeführt wird, wenn es aufgerufen wird. Wenn es also nur ein einfacher primitiver Typ wie String
oder ist Int
, ist das nicht so schlimm. Es ist im Wesentlichen eine berechnete Eigenschaft. Wenn es sich um eine Konstante handelt, die berechnet werden muss und Sie sie nur einmal berechnen möchten, sollten Sie sie in eine andere Eigenschaft berechnen und den bereits berechneten Wert im Abschluss zurückgeben.
Sie können den Standardinitialisierer auch mit einem privaten überschreiben, und dann erhalten Sie die gleiche Art von Fehler beim Kompilieren von Fehlern wie bei der Aufzählung ohne Gehäuse.
struct StaticVars {
static let someString = "someString"
private init() {}
}
Damit möchten Sie jedoch die Deklaration der Struktur in eine eigene Datei einfügen. Wenn Sie sie in derselben Datei wie beispielsweise einer View Controller-Klasse deklarieren, kann die Datei dieser Klasse dennoch versehentlich eine nutzlose Datei instanziieren Instanz von StaticVars
, aber außerhalb der Datei der Klasse würde es wie beabsichtigt funktionieren. Aber es ist dein Anruf.