Comment faire pour réinitialiser les variables statiques dans une structure à leurs valeurs par défaut - Swift

0

La question

J'ai une struct avec certaines variables statiques que j'ai besoin d'utiliser tout au long de mon application (je n'ai pas utiliser une classe singleton encore parce que je peut avoir besoin de plusieurs instances dans l'avenir, mais pour l'instant je n'ai que cette instance unique).

Chaque variable statique est attribuée une valeur par défaut, mais ces valeurs sont modifiées tout au long de la durée de vie de l'application. J'ai également stocker ces changements dans UserDefaults afin qu'ils soient persistants entre les invocations, mais j'ai toujours utiliser ces variables statiques parce que je ne veux pas lire à partir de la UserDefaults à chaque fois.

Maintenant, je veux l'option pour réinitialiser l'ensemble de ces valeurs à leurs valeurs d'origine par défaut et je ne peux pas comprendre comment le faire correctement. Je peux utiliser une structure qui va contenir les valeurs par défaut et ensuite utiliser un func pour changer les valeurs d'une de ses variables dans l'autre. Mais il ne semble pas si élégant et il doit y avoir une plus belle façon de le faire que je suis absent.

J'ai essayé d'ajouter une touche func à l'intérieur de la structure qui effectue les opérations suivantes:

func resetDefaults() {
    self = DefaultStruct()
}

Le compilateur me dit je ne peux pas changer d'auto et besoin de faire la touche func mutation. Je l'ai fait. Mais alors, d'ailleurs dans mon code, dans une autre classe, cette fonction n'est plus dans le champ d'application. Si je les ajoute:

DefaultStruct.resetDefaults()

Il me donne d'autres erreurs, telles que:

Instance member 'resetDefaults' cannot be used on type 'DefaultStruct'; did you mean to use a value of this type instead?

Aussi, parce que j'utilise les variables statiques de cette structure directement, je n'ai jamais initialisé cette structure. En d'autres termes, je n'ai pas une telle structure par le nom que je peux accès ailleurs. Ou peut-être que je me trompe et je suis en manque de quelque chose???

Votre aide serait grandement appréciée. Soit je suis absent quelque chose de très basique ou je vais juste utiliser une struct avec les valeurs par défaut comme je l'ai dit avant.

Merci!

default-value static swift
2021-11-23 19:03:17
1

La meilleure réponse

1

Comme un exemple trivial qui explique le concept

struct Foo {
   private enum Defaults {
     static let barDefault = "Initial String"
   }
   
   static var bar: String = Defaults.barDefault
   
   static func reset() {
      bar = Defaults.barDefault
   }
   
}
    
print(Foo.bar)  //Initial String

Foo.bar = "New String"
print(Foo.bar)  // New String

Foo.reset()
print(Foo.bar)  // Initial String

Il utilise un privé enum pour tenir les chaînes par défaut de sorte qu'il (a) reste inernal de la structure, même lorsqu'il est utilisé par d'autres les attributs statiques et (b) de sorte qu'il ne peut pas être instancié par erreur.

Si vous avez de plus en plus complexes de type pour la variable, utiliser un initialiser avec une valeur par défaut qui est l'initiale / réinitialisation de la valeur, de sorte que vous pouvez faire quelque chose comme ceci:

struct Foo {
   struct ComplexStruct{
       var x: SomeType

       init(x: SomeType = DefaultValue) { self.x = x }
   }

   static var bar = ComplexStruct()
   
   static func reset() {
      bar = ComplexStruct()
   }
}
2021-11-24 00:38:42

merci pour votre réponse. Dans la 1ère partie, vous avez "Première Chaîne" à deux reprises, une fois dans la déclaration de la variable et une fois dans la fonction reset (). C'est exactement ce que je voulais éviter, comme si je vais avoir besoin de changer certaines de valeur par défaut, je vais toujours vous rappeler de le faire en 2 places et qui est une cause d'erreurs. J'espérais qu'il y aurait une façon de définir le juste une fois dans une façon plus élégante. Comme pour le 2ème semestre, je vais l'essayer et de revenir. Merci encore. C'est une grande aide!
rafi

@rafi-je peut-être fait la première partie trop trivial. J'ai juste mis à jour la réponse à cette adresse.
flanker

merci encore pour cette mise à jour! La première partie est maintenant semblable à ce que je pensais avoir à faire, mais votre suggestion d'utiliser un enum et de mettre ces valeurs par défaut à l'intérieur de la même structure elle-même est excellent! Depuis nous faisons la même chose lors de la déclaration de ces variables et lors de la réinitialisation de leurs valeurs, j'espérais que nous pourrions écrire ce code qu'une fois et puis peut-être avoir un initialiseur qui appellent la fonction reset (), mais je n'ai pas réussi à le faire fonctionner donc j'ai fini par faire exactement ce que vous avez suggéré et qui fonctionne à la perfection. Donc merci encore!
rafi

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................