2017-07-06 1 views
3

Quelle est la différence entre une variable globale et une instance partagée dans Swift? quels sont leurs domaines d'utilisation respectifs? Quelqu'un pourrait-il clarifier leur concept basé sur Swift.Var global vs instance partagée swift

+0

https://stackoverflow.com/questions/32660471/any-reason-not-use-use-a-singleton-variable-in-swift –

Répondre

-2

Singleton (exemple de partage)

Assurez-vous qu'une seule instance d'un objet singleton est créé & Il est globalement fournir un accès par instance partagée d'un objet qui pourrait être partagé même à travers une application. La fonction dispatch_once, qui exécute un bloc une fois et only once for the lifetime of an app.

Variable globale

documentation Apple indique les variables globales sont des variables qui sont définies outside of any function, method, closure, or type context.

+1

Ce ne sont pas des variables globales. Vous avez cité la documentation indiquant que les variables globales sont définies en dehors de tout type de contexte, puis déclaré vos "variables globales" dans les types. –

2

Une variable globale est une variable déclarée au premier niveau d'un fichier. Donc, si nous avions une classe appelée Bar, vous pouvez stocker une référence à une instance de Bar dans une variable globale comme ceci:

var bar = Bar() 

Vous serez alors en mesure d'accéder à l'instance de partout, comme ceci:

bar 
bar.foo() 

Une instance partagée, ou singleton, ressemble à ceci:

class Bar { 
    static var shared = Bar() 
    private init() {} 
    func foo() {} 
} 

Ensuite, vous pouvez accéder à l'instance partagée, encore partout dans le module, comme ceci:

Bar.shared 
Bar.shared.foo() 

Cependant, l'une des plus importantes différences entre les deux (en dehors du fait que les variables globales sont juste généralement découragés) est que le modèle singleton vous empêche de créer d'autres instances de Bar. Dans le premier exemple, vous pouvez créer simplement des variables plus globales:

var bar2 = Bar() 
var bar3 = Bar() 

Cependant, en utilisant un singleton (instance partagée), le privé est initialiseur, donc essayer de le faire ...

var baaar = Bar() 

... aboutit à ceci: "L'initialiseur" Bar "est inaccessible en raison du niveau de protection" privé ".

C'est une bonne chose, car le point d'un singleton est qu'il y a une instance partagée simple. Maintenant, la seule façon d'accéder à une instance de Bar passe par Bar.shared. Il est important de ne pas oublier d'ajouter le private init() dans la classe, et de ne pas ajouter d'autres initialiseurs, ou qui ne seront plus appliqués.

Si vous voulez plus d'informations à ce sujet, il y a un bon article par KrakenDev here.