2015-11-24 5 views

Antwort

5

Mit einer Klasse, die Sie eine Unterklasse erstellen und offensichtlich overrideclass 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 subclassclass 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) 
    } 
} 

loszuwerden

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.

1

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

+0

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. –

+0

Nun, das ist wahr @ RMenke. –

Verwandte Themen