Ich möchte eine Constants-Datei in meinem Swift-Projekt erstellen - gefüllt mit statischen Let-Strings.Swift Constants Datei - Klasse oder Struktur?
Sollte ich als eine Struktur oder eine Klasse erstellen? Und warum?
Ich möchte eine Constants-Datei in meinem Swift-Projekt erstellen - gefüllt mit statischen Let-Strings.Swift Constants Datei - Klasse oder Struktur?
Sollte ich als eine Struktur oder eine Klasse erstellen? Und warum?
Mit einer Klasse, die Sie eine Unterklasse erstellen und offensichtlich override
class
Methoden. Wenn Sie nur static
verwenden, gibt es keinen Unterschied. Wenn die Eigenschaften Value-Typen sind, ist static if let someTypeProperty
in Ordnung. Wenn es sich um Referenztypen handelt, ist besondere Vorsicht geboten.
Nur ein paar Sachen mit den Eigenschaften:
struct PresetStringsStruct {
static let someString : String = "Some Text" // struct
static let someView : UIView = UIView(frame: CGRectZero)
private init() {
print("init") // never happens
}
}
class PresetStringsClass {
static let someString : String = "Some Text" // struct
static let someView : UIView = UIView(frame: CGRectZero)
private init() {
print("init") // never happens
}
}
struct
Eigenschaften wie erwartet.
// value properties
var txtStruct = PresetStringsStruct.someString // "Some Text"
txtStruct = "SomeOtherText" // "SomeOtherText"
var txtStruct2 = PresetStringsStruct.someString // "Some Text"
var txtClass = PresetStringsClass.someString // "Some Text"
txtClass = "SomeOtherText" // "SomeOtherText"
var txtClass2 = PresetStringsClass.someString // "Some Text"
Wenn die Eigenschaft ein reference type
ist die statischen Eigenschaften Verweise auf eine Instanz zurück.
// reference properties
var viewStruct = PresetStringsStruct.someView
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 50, height: 50)
var viewClass = PresetStringsClass.someView
viewClass.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewClass2 = PresetStringsClass.someView // CGRect(x: 0, y: 0, width: 50, height: 50)
Die einzige narrensicher Methode, die ich kenne static
Funktionen zu bedienen ist. Sie können natürlich class
Funktionen verwenden, wenn Sie subclass
class
und override
die Funktionen ausführen können. (static
erlaubt keine Überschreibung und ist eigentlich ein Alias für class final
)
Dies verhindert auch, zu viele Typ-Eigenschaften von im Speicher verbleibenden Es gibt keine Möglichkeit eines static let someProperty : Int = 0
struct PresetStringsStruct {
static func someStringFunc() -> String {
return "SomeText"
}
static func someViewFunc() -> UIView {
return UIView(frame: CGRectZero)
}
}
class PresetStringsClass {
static func someStringFunc() -> String {
return "SomeText"
}
static func someViewFunc() -> UIView {
return UIView(frame: CGRectZero)
}
}
Dann liegt es an Ihnen zu entscheiden, was mehr Sinn macht. Da der umschließende struct
oder class
nie selbst verwendet wird, macht es keinen Unterschied.Für mich macht ein struct
mehr Sinn, weil ich zu viel Verhalten mit classes
assoziiere.
Sie können auch selbst mehr Arbeit geben und loszuwerden die ()
die aus der Verwendung Funktionen anstelle von Eigenschaften führt.
Sie structs für statische Daten verwenden kann, ist die beste Wahl:
struct staticStrings {
static let name = "String1"
static let age = "age1"
}
Und die Daten global für den Zugriff auf nur staticStrings.name
nennen.
Warum verwenden wir structs und es ist besser als Klasse: Structs vorzuziehen sind, wenn sie relativ klein und kopierbar sind, weil das Kopieren ist viel sicherer als auf die gleiche Instanz mehr Referenz, wie sie mit den Klassen geschieht.
Für weitere Informationen: structs and classes
Wenn eine Klasse oder eine Struktur nur statische Eigenschaften/Methoden hat und niemals initialisiert wird, spielt es keine Rolle, dass der Typ selbst ein Referenz- oder Werttyp ist. Es ist nur wichtig, wie ihr Verhalten das Verhalten ihrer Eigenschaften beeinflusst. –
Nun, das ist wahr @ RMenke. –