2016-04-22 13 views
17

sono i due approcci la stessa o ci sono grandi differenze/insidie ​​di essere a conoscenza di:Qual è la differenza tra singleton basati su Struct e Class?

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") } 
} 

risposta

30

La differenza principale è che il singleton mutabile basato su classi funziona, mentre il "singleton" mutabile basato su struct non lo fa. A meno che tu non voglia rendere il tuo singleton immutabile (cosa rara) dovresti attenersi a quello basato sulla classe.

Ecco un'illustrazione di come "singleton" mutevole basato su struct non funziona. Considerare l'aggiunta di un membro mutabile state ad entrambi single, in questo modo:

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)") } 
} 

Ho fatto un statevar, ma ho potuto esporre come una proprietà di sola lettura più un metodo di mutante; la cosa essenziale è che entrambi i tipi sono ora mutabili.

Se faccio questo

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

42 viene stampato, perché csi fa riferimento l'istanza condivisa.

Tuttavia, quando faccio la stessa cosa con struct a base di Singleton

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

5 viene stampato, invece, a causa ssi è una copia del sharedInstance, che è, ovviamente, l'indicazione che il nostro Singleton è non in realtà un singleton.

+0

interessante, usando 'static var sharedInstance' invece di' static let sharedInstance' fa sembrare che funzioni. Una nuova copia della struct è generata ogni volta che chiamo 'MyStructSingleton.sharedInstance'? –

+1

@RunningTurtle Una nuova copia di 'MyStructSingleton' viene creata quando si dichiara una nuova variabile di tipo' MyStructSingleton'. Dopo aver assegnato 'sharedInstance' ad esso, i due diventano identici, ma non sono la stessa istanza. La stessa cosa accade quando si passa 'MyStructSingleton' come parametro o lo si restituisce da un metodo. – dasblinkenlight

2

Questo dipende da ciò che si vuole raggiungere e come si desidera utilizzare la struttura in base alle differenze tra class e struct . La cosa più comune che vedrai è usare la classe con oggetto singleton.

Singletons sono praticamente la stessa, vengono creati solo una volta, ma si ottengono comportamenti diversi dal class e da struct perché:

  • Le classi sono tipi di riferimento, mentre le strutture sono tipi di valore
  • le strutture vengono utilizzate per definire strutture semplici
  • le strutture non può essere ereditata

ci sono molti di più differen ces ma ottieni l'idea da questo.

Problemi correlati