Singleton in Swift

Uno dei pattern più utilizzati durante lo sviluppo è sicuramente il Singleton. Per chi non lo sapesse, la definizione di pattern Singleton è la seguente1:

Il singleton è un design pattern creazionale che ha lo scopo di garantire che di una determinata classe venga creata una e una sola istanza, e di fornire un punto di accesso globale a tale istanza.

Con un singleton, quindi, possiamo avere un’unica istanza di una determinata classe, che viene condivisa tra le varie classi che la utilizzano.

Come possiamo creare un singleton in Swift? Vediamo due possibili alternative.

Costante globale

private let _sharedInstance = MySingletonClass()

class MySingletonClass  {
    class var sharedInstance : MySingletonClass {
        return _sharedInstance
    }
}

In questa prima modalità andiamo a creare una costante globale, che sarà disponibile solo all’interno del file stesso (quindi non andrà a disturbare il namespace globale). All’interno della classe utilizzeremo poi una computed property, che ritornerà l’istanza stessa. L’ottimizzazione è garantita da Swift, che istanza in maniera lazy le costanti globali.

Nested struct

Il secondo metodo sfrutta maggiormente tutti i nuovi concetti di classi e struct introdotti con Swift.

class MySingletonClass {
    class var sharedInstance : MySingletonClass {
        struct Static {
            static let instance = MySingletonClass()
        }
        return Static.instance
    }
}

A differenza delle classi, le struct supportano costanti globali, quindi possiamo definire instance direttamente all’interno della struct stessa. La proprietà sharedInstance servirà unicamente a ritornare l’instanza creata all’interno della struct.

Considerazioni

Al momento la mia scelta ricade sul secondo metodo, ovvero utilizzando le nested struct. A mio avviso il codice rimane più compatto e sicuramente più “Swift-oriented”.

Voi quale metodo utilizzate? Avete delle alternative? Fatemelo sapere :]

Fonti:
1. https://github.com/hpique/SwiftSingleton
2. http://thatthinginswift.com/singletons/


  1. Definizione tratta da Wikipedia http://it.wikipedia.org/wiki/Singleton 

Ingegnere informatico e sviluppatore freelance, mi occupo da anni di sviluppo per iOS (ma non solo). Dal 2008 scrivo su questo piccolo blog (con qualche lunga pausa), in cui parlo di programmazione e di qualsiasi altra cosa che mi diverta.

2 comments On Singleton in Swift

  • Ciao Andrea! Io uso

    class var sharedInstance: DefaultParameter {
            get {
                struct Static {
                    static var instance : DefaultParameter? = nil
                    static var token : dispatch_once_t = 0
                }
                
                dispatch_once(&Static.token) { Static.instance = DefaultParameter() }
                
                return Static.instance!
            }
        }
    

    e va benone!

Leave a Reply to Andrea Busi Cancel Reply

Your email address will not be published.

Site Footer