Cómo restablecer las variables estáticas en una estructura a sus valores predeterminados - Swift

0

Pregunta

Tengo un struct con algunas variables estáticas que necesito para utilizar a lo largo de mi aplicación (yo no uso una clase singleton sin embargo, debido a que puede tener varias instancias en el futuro, pero ahora mismo solo tengo esta instancia única).

Cada variable estática se le asigna un valor por defecto, pero estos valores se cambian a lo largo de la vida útil de la aplicación. Yo también almacenar estos cambios en UserDefaults por lo que sería persistente entre las invocaciones, pero yo todavía uso de estas variables estáticas porque no me quiere leer el UserDefaults cada vez.

Ahora quiero la opción para restablecer todos estos valores a sus valores predeterminados originales y que no puedo averiguar cómo hacer esto correctamente. Puedo utilizar una estructura que mantenga los valores predeterminados y, a continuación, utilizar una func para cambiar los valores desde uno a su respectiva variable en la otra. Pero parece que no tan elegante y debe haber una mejor manera de hacer esto que me estoy perdiendo.

He intentado añadir un func dentro de la estructura que hace lo siguiente:

func resetDefaults() {
    self = DefaultStruct()
}

El compilador me dijo que no se puede cambiar el auto y la necesidad de hacer la func mutando. Así que lo hice. Pero luego en otras partes de mi código, en otra clase, esta función ya no está en el alcance. Si añado:

DefaultStruct.resetDefaults()

Me da otros errores, tales como:

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

También, porque yo uso las variables estáticas de esta estructura directamente, nunca he inicializado esta estructura. En otras palabras, no tengo un struct por el nombre que me puede acceder a otros lugares. O tal vez estoy equivocado y me estoy perdiendo algo???

Su ayuda sería muy apreciada. O me estoy perdiendo algo muy básico o voy a usar un struct con los valores por defecto como he dicho antes.

Gracias!

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

Mejor respuesta

1

Como un ejemplo trivial que demuestra el concepto

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

Este utiliza una enumeración para mantener el valor predeterminado cadenas por lo que es (un) sigue siendo inernal a la estructura, incluso cuando se utiliza en otros atributos estáticos y (b), por lo que no puede ser instanciado por error.

Si usted tiene un tipo más complejo de la variable, el uso de un initialiser con un valor por defecto que es la inicial / valor de reset así que usted puede hacer algo como esto:

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

gracias por su respuesta. En la 1ª parte, tiene "Primera Cadena" dos veces, una vez en la declaración de variables y una vez en el reset() función. Eso es exactamente lo que yo quería evitar como si me necesitará cambiar algún valor predeterminado voy a tener que recordar siempre hacerlo en 2 lugares y que es la causa de los errores. Me esperaba que hubiera una manera de definir sólo una vez en una forma más elegante. Como para el 2do semestre, voy a intentarlo y volver. Gracias de nuevo. Esto es de gran ayuda!
rafi

@rafi yo, posiblemente la primera parte demasiado trivial. He actualizado la respuesta a la dirección de esta.
flanker

gracias de nuevo por esta actualización! La primera parte es ahora similar a lo que yo pensé que tendría que hacer, pero su sugerencia de que el uso de una enumeración y poniendo estos valores por defecto dentro de la misma estructura que en sí es excelente! Ya que nosotros hacemos lo mismo cuando se declaran las variables y cuando restablecer sus valores, tenía la esperanza de que podemos escribir el código una sola vez y, a continuación, tal vez tienen un inicializador de lo que llamaría el reset() función, pero no tuve éxito en lo que es el trabajo, así que terminé haciendo exactamente lo que usted sugiere y que ahora funciona a la perfección. Así que gracias de nuevo!
rafi

En otros idiomas

Esta página está en otros idiomas

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