2015-11-24 14 views

Odpowiedz

5

z klasą można utworzyć podklasę i oczywiście overrideclass metod. Jeśli używasz wyłącznie static, nie ma żadnej różnicy.

Jeśli właściwości są Typy wartości, static if let someTypeProperty będzie w porządku. Jeśli są to typy referencyjne, należy zachować szczególną ostrożność.


Tylko niektóre rzeczy o właściwościach:

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 właściwości działać zgodnie z oczekiwaniami.

// 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" 

Gdy właściwość jest reference type właściwości statycznych powróci odwołań do jednego przykładu.

// 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) 

Jedyny dowód głupi sposób, że wiem jest użycie static funkcje. Oczywiście można korzystać z funkcji class, jeśli chcesz mieć możliwość korzystania z funkcji subclass z class i override. (static nie pozwala na nadpisanie i jest właściwie aliasem class final)

Zapobiega to również zbyt wiele właściwości typu pozostawaniu w pamięci Nie ma sposobu, aby pozbyć się 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) 
    } 
} 

To od Ciebie zależy, co ma sens. Ponieważ obudowa struct lub class nigdy nie jest używana sama, nie ma znaczenia.Dla mnie struct ma więcej sensu, ponieważ wiążę zbyt wiele zachowania z classes.


Można również dać sobie więcej pracy i pozbyć się () wynikającej z korzystania z funkcji zamiast właściwości.

struct PresetStringsStruct { 

    static var someString : String { 
     get { 
      return someStringFunc() 
     } 
    } 

    static var someView : UIView { 
     get { 
      return someViewFunc() 
     } 
    } 

    static func someStringFunc() -> String { 
     return "SomeText" 
    } 

    static func someViewFunc() -> UIView { 
     return UIView(frame: CGRectZero) 
    } 
} 

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: 0, height: 0) 
1

Można użyć konstrukcjom dla danych statycznych jest to najlepszy wybór:

struct staticStrings { 

    static let name = "String1" 
    static let age = "age1" 

} 

I aby uzyskać dostęp do danych na całym świecie po prostu zadzwoń staticStrings.name.

Dlaczego używamy konstrukcjom i jej lepiej niż klasy: struktury są korzystne, jeśli są one stosunkowo małe i copiable ponieważ kopiowanie jest sposób bezpieczniejszy niż o wiele odniesień do tej samej instancji, jak dzieje się z zajęć.

Aby uzyskać więcej informacji: structs and classes

+0

Gdy klasa lub struct ma tylko statyczne właściwości/metody i nigdy nie zostanie zainicjalizowana, nie ma znaczenia, że ​​sam typ jest typem Reference lub Value. Ma znaczenie tylko, jak ich zachowanie wpływa na zachowanie ich właściwości. –

+0

To jest prawda @RMenke. –

Powiązane problemy