2015-06-24 16 views
15

Sto imparando a conoscere il pattern Singleton in modo rapido ed efficiente per creare una classe Singleton e ho scoperto il modo migliore per creare come di seguito.Come creare oggetti Singleton in swift

class SingletonClass{ 
    static let sharedInstance = SingletonClass() 
} 

dal momento che ho utilizzare l'istruzione let è sola lettura proprietà e deve essere thread-safe quindi non c'è bisogno di dispatch_once() come dell'obiettivo C.And static è usato per fare la variabile sharedInstance come Variabile class credo.

Ma come fa questa garanzia c'è solo una istanza creata in tutta l'applicazione? C'è una piccola cosa che mi manca?

+2

Quante copie di questa classe (al contrario di * * oggetti di questa classe) pensi che ci sarà? –

+0

una copia di questa classe ... ma potrei accedervi come SingletonClass.sharedInstance in molti posti ... –

+2

Stai suggerendo che accedervi in ​​qualche modo fa più copie? –

risposta

9

Che garanzie viene creato solo una volta è la parola chiave statica. puoi fare riferimento a questo articolo: https://thatthinginswift.com/singletons/

Spero che questo aiuti.

La parola chiave static indica che una variabile membro, o un metodo, possono essere accessibili senza richiedere un istanza della classe a cui appartiene . In termini semplici, significa che si può chiamare un metodo, anche se non hai mai creato l'oggetto a cui appartiene

+1

è possibile aggiornare la definizione di staticità nella risposta? –

+1

non si dichiara statico in modo che non sia necessario creare un oggetto per accedere alla variabile? essere più specifici perché dichiarare statico in questo caso? –

21

Se si vuole evitare istanziazione della classe (limitando in modo efficace l'utilizzo di solo il singleton), quindi contrassegni il tuo inizializzatore come private:

private init() 
{ 
    // initializer code here 
} 
+0

grazie..questo era anche qualcosa che mi serviva –

+0

ma sono in grado di creare un oggetto.non mi dà errore nella creazione di oggetti nel parco giochi –

+1

@ copeME: i metodi privati ​​possono essere richiamati solo all'interno del file in cui sono stati dichiarati. –

1

Hai ragione. E si consiglia di leggere Files and Initialization su come globale e variabile statica sono maniglia a Swift

uso Swift questo approccio

inizializzazione pigramente, eseguire l'inizializzatore per un globale la prima volta che viene fatto riferimento, simile a Giava.

Dice

permette inizializzatori personalizzati, il tempo di avvio a Swift scale in modo pulito senza inizializzatori globali per rallentarlo, e l'ordine di esecuzione è del tutto prevedibile.

L'inizializzatore artificiale per una variabile globale (anche per i membri statici di strutture e enumerazioni) viene eseguito la prima volta che si accede globale, e viene lanciato come dispatch_once per assicurarsi che l'inizializzazione è atomico. Ciò consente di utilizzare in modo semplice dispatch_once nel codice: solo dichiarare una variabile globale con un inizializzatore e contrassegnarlo come privato .

2

Fai init privato, ad esempio:

final class Singleton { 

    // Can't init is singleton 
    private init() { } 

    //MARK: Shared Instance 

    static let sharedInstance: Singleton = Singleton() 

    //MARK: Local Variable 

    var emptyStringArray : [String] = [] 

} 
Problemi correlati