2016-04-22 8 views
17

są dwa podejścia takie same lub czy istnieją istotne różnice/pułapek być świadomi:Jaka jest różnica między singletonami opartymi na strukturze i opartymi na klasach?

class MyClassSingleton { 
    static let sharedInstance = MyClassSingleton() 
    private init(){} 

    func helloClass() { print("hello from class Singleton") } 
} 

struct MyStructSingleton { 
    static let sharedInstance = MyStructSingleton() 
    private init() {} 

    func helloStruct() { print("hello from struct Singleton") } 
} 

Odpowiedz

30

Główna różnica polega na tym, że mutant działający w oparciu o klasy działa w oparciu o klasy, podczas gdy oparty na strukturze "singleton" nie działa. Jeśli nie chcesz, aby twój singleton był niezmienny (co jest rzadkością), powinieneś trzymać się klasy opartej na klasach.

Oto ilustracja tego, jak mutable "singleton" oparte na strukturze nie działa. Rozważyć dodanie zmienny element state się zarówno pojedynczych, jak to:

class MyClassSingleton { 
    static let sharedInstance = MyClassSingleton() 
    private init(){} 
    var state = 5 
    func helloClass() { print("hello from class Singleton: \(state)") } 
} 

struct MyStructSingleton { 
    static let sharedInstance = MyStructSingleton() 
    private init() {} 
    var state = 5 
    func helloStruct() { print("hello from struct Singleton: \(state)") } 
} 

zrobiłem statevar, ale mogę wystawiać go jako właściwość tylko do odczytu plus metody mutowania; najważniejsze jest to, że oba typy są teraz zmienne.

Jeśli mogę to zrobić

let csi = MyClassSingleton.sharedInstance 
csi.state = 42 
MyClassSingleton.sharedInstance.helloClass() 

42 zostanie wydrukowany, ponieważ csi odwołuje udostępnionego instancji.

Jednak, gdy robię to samo z struct oparte Singleton

var ssi = MyStructSingleton.sharedInstance 
ssi.state = 42 
MyStructSingleton.sharedInstance.helloStruct() 

5 zostanie wydrukowany zamiast, ponieważ ssi jest kopia sharedInstance, co jest, oczywiście, wskazanie, że nasza Singleton właściwie nie singleton.

+0

Co ciekawe, użycie 'static var sharedInstance' zamiast' static let sharedInstance' sprawia, że ​​wydaje się działać. Czy nowa kopia struktury jest generowana za każdym razem, gdy nazywam 'MyStructSingleton.sharedInstance'? –

+1

@RunningTurtle Nowa kopia 'MyStructSingleton' jest tworzona po zadeklarowaniu nowej zmiennej typu' MyStructSingleton'. Po przypisaniu do niego parametru "sharedInstance" obie stają się identyczne, ale nie są to te same instancje. To samo dzieje się, gdy przekazujesz 'MyStructSingleton' jako parametr lub zwracasz go z metody. – dasblinkenlight

2

To zależy od tego, co chcesz osiągnąć i jak chcesz wykorzystać swoje struktury w oparciu o różnice pomiędzy class i struct . Najczęściej spotykaną rzeczą jest używanie klasy z obiektem singleton.

Singletons są prawie takie same, są one tworzone tylko raz, ale dostaniesz różne zachowania z class iz struct ponieważ:

  • Klasy są typy referencyjne, podczas gdy struktury są typy wartości
  • struktury są wykorzystywane w celu określenia prostych struktur
  • elemencie nie mogą być dziedziczone

Istnieje kilka więcej tarasowy ale masz pomysł z tego.

Powiązane problemy