Quand utiliser une constante statique et variable dans Swift

Il y a quelques messages pour écrire le code pour static constant static variable et static variable dans Swift. Mais il n'est pas clair quand utiliser static constant static variable et static variable plutôt que constant et variable . Quelqu'un peut-il expliquer?

Lorsque vous définissez un var / let statique dans une class (ou struct), cette information sera partagée entre toutes les instances (ou valeurs).

Partage d'informations

 class Animal { static var nums = 0 init() { Animal.nums += 1 } } let dog = Animal() Animal.nums // 1 let cat = Animal() Animal.nums // 2 

Comme vous pouvez le voir ici, j'ai créé 2 instances distinctes d' Animal mais les deux partagent la même variable statique nums .

Singleton

Souvent, une constante statique est utilisée pour adopter le motif Singleton. Dans ce cas, nous ne souhaitons pas atsortingbuer plus d'une instance d'une class. Pour ce faire, nous sauvegardons la reference à l'instance partagée dans une constante et nous cachons l'initialiseur.

 class Singleton { static let sharedInstance = Singleton() private init() { } func doSomething() { } } 

Maintenant, quand nous avons besoin de l'instance de Singleton , nous écrivons

 Singleton.sharedInstance.doSomething() Singleton.sharedInstance.doSomething() Singleton.sharedInstance.doSomething() 

Cette approche nous permet d'utiliser toujours la même instance, même dans différents points de l'application.

Il y a quelques messages pour écrire le code pour la constante statique et la variable statique dans Swift. Mais il n'est pas clair quand utiliser une constante statique et une variable statique plutôt que constante et variable. Quelqu'un peut-il expliquer? Lorsque vous définissez un var / let statique dans une class (ou struct), cette valeur sera partagée entre toutes les instances (ou valeurs).

variables statiques / class sont des variables peuvent être accessibles sans besoin de création d'une instance / object.

 class Human { static let numberOfEyes = 2 //human have only 2 eyes static var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable //other variables and functions } //you can access numberOfEyes like below no object of Human is created print(Human.numberOfEyes) print(Human.eyeDefect) //Object of Human let john = Human() 

Je pense que vous connaissez la différence entre constante et variable. Bref, constante est celle dont la valeur ne change jamais; numberOfEyes dans l'exemple ci-dessus et la variable est celle dont la valeur change; eyeDefect dans l'exemple ci-dessus.

La constante statique ou les variables sont placées en memory (RAM) séparées des objects. c'est-à-dire que numberOfEyes a un espace memory différent alloué à l'object John, ce n'est pas à l'intérieur de John.

maintenant, quand utiliser des constantes / variables statiques:

  1. Lorsque vous utilisez le motif de design singleton: static let sharedInstance = APIManager ()

     class APIManager(){ static let sharedInstance = APIManager() //Your other variables/functions here below } //Use it as to get singleton instance of APIManager from anywhere in your application let instanceOfAPIManager = APIManager.sharedInstance 
  2. Lorsque vous avez besoin de la valeur de tout ce qui est globalement le même sans avoir besoin de faire une instance de la class sous laquelle il est défini comme numberOfEyes dans la class humaine.

  3. L'utilisation de variables / constantes statiques n'est pas recommandée en raison de problèmes de memory car une fois instanciée / assignée, elle rest en memory jusqu'à ce que votre application soit retirée de la memory. J'ai trouvé jusqu'à maintenant le meilleur endroit pour utiliser des variables / constantes statiques seulement en créant un motif singleton et parfois des pointeurs pour d'autres variables et constantes normales n'utilisent pas statique parce que: problème de memory, il sera difficile d'exécuter des tests unitaires dans votre code avec des variables / constantes statiques. Non recommandé d'utiliser comme dans la class humaine aussi. utilisez-les plutôt comme des constantes ou des variables et accédez-y en faisant une instance.

     class Human { let numberOfEyes = 2 //human have only 2 eyes var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable //other variables and functions } //you can access numberOfEyes like below if you need just those values. print(Human().numberOfEyes) print(Human().eyeDefect) 

Les constantes statiques et les variables appartiennent à la class elle-même, pas à une instance particulière. Une class peut également avoir des methods statiques qui peuvent être appelées sans créer une instance d'une class.

Ainsi, lorsque vous avez une class MyClass avec une MyClass statique x , vous pouvez également y accéder directement via MyClass.x . x sera partagé entre toutes les instances d'une class