Jak obnovit statické proměnné v struct na jejich výchozí hodnoty - Swift

0

Otázka

Mám struct s nějaké statické proměnné, které musím používat v celé mé aplikace (nechtěl jsem použít singleton třídy, ale protože jsem potřebovat více instancí v budoucnu, ale teď mám jen jednu instanci).

Každá statická proměnná je přiřazena výchozí hodnoty, ale tyto hodnoty se změnily v průběhu životnosti aplikace. Jsem také uložit tyto změny v UserDefaults, takže by bylo přetrvávající mezi vzývání, ale já jsem stále používat tyto statické proměnné, protože nechci číst z UserDefaults pokaždé.

Teď chci, možnost resetovat všechny tyto hodnoty na jejich původní výchozí hodnoty a nemůžu přijít na to, jak to udělat správně. Můžu použít samostatný struct, která se bude konat výchozí hodnoty a pak použít func změnit hodnoty od jedné do jeho příslušné proměnné v jiných. Ale zdá se, není tak elegantní, a tam musí být lepší způsob, jak to udělat, že mi chybí.

Snažil jsem se přidat func uvnitř struct, který má následující:

func resetDefaults() {
    self = DefaultStruct()
}

Kompilátor mi řekl, že nemůžu změnit sebe a je třeba, aby func mutuje. Tak jsem to udělal. Pak se ale jinde v mém kódu, v další třídě, tato funkce je již v rozsahu. Když jsem se připojit:

DefaultStruct.resetDefaults()

To mi dává jiné chyby, jako například:

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

Také, protože jsem používat statické proměnné této struct přímo, nikdy jsem inicializovat tato struct. Jinými slovy, nemám takové struct jméno, že mám přístup jinde. Nebo možná se mýlím a něco mi uniká???

Vaše pomoc bude velmi ocenil. Buď mi uniká něco velmi základního, nebo budu jen použít samostatný struct s výchozí hodnoty, jak jsem řekl dříve.

Díky!!!

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

Nejlepší odpověď

1

Jako velmi triviální příklad, který ukazuje, koncept

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

To používá vlastní enum držet výchozí řetězce, tak to (a) zůstává inernal do struct, a to i při použití v jiné statické atributy a (b) tak, že nemůže být vytvořena omylem.

Pokud máte složitější typ proměnné, použijte initialiser s výchozí hodnotu, která je intial / reset hodnoty, takže si můžete udělat něco jako toto:

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

díky za vaši odpověď. V 1. části, budete mít "Počáteční Řetězec" dvakrát, jednou v deklaraci proměnné a poté, co v reset() funkce. To je přesně to, čemu jsem se chtěla vyhnout, jako když budu potřebovat změnit některé výchozí hodnoty musím vždy pamatovat na to ve 2 místech, a to je příčinou chyby. Doufal jsem, že tam by mohl být způsob, jak definovat to jen jednou za více elegantní způsob, jak. Jako pro 2. polovinu, zkusím to a dám zpět. Ještě jednou díky. To je velká pomoc!
rafi

@rafi jsem možná udělal první části příliš triviální. Právě jsem aktualizoval odpověď na adresu.
flanker

ještě jednou díky za tento update! První část je nyní podobný tomu, co jsem myslel, že budu muset udělat, ale váš návrh pomocí enum a že tyto výchozí hodnoty uvnitř stejné struct sám o sobě je vynikající!!! Od doby, co jsme dělat to samé, když prohlašuje, tyto proměnné a při obnovení jejich hodnoty, doufal jsem, že bychom mohli napsat kód jen jednou a pak možná mít inicializátor, který by volání reset() funkce, ale nepovedlo se mi to při práci, takže jsem skončil dělá přesně to, co jsi navrhl, a to teď funguje perfektně. Takže ještě jednou díky!
rafi

V jiných jazycích

Tato stránka je v jiných jazycích

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