Ako obnoviť statické premenné v struct na ich predvolené hodnoty - Swift

0

Otázka

Mám struct s niektoré statické premenné, ktoré potrebujem na použitie v celej mojej aplikácie (nechcel som použiť singleton triedy, ale preto som možno potrebné viaceré inštancie v budúcnosti, ale teraz mám len túto jednu inštanciu).

Každý statická premenná je pridelené predvolenú hodnotu, ale tieto hodnoty dostať meniť počas celého trvania aplikácie. Som tiež ukladať tieto zmeny v UserDefaults tak by byť vytrvalý medzi vyvolaniami, ale ja som stále používať tieto statické premenné, pretože nechcem čítať z UserDefaults každý čas.

Teraz chcem, možnosť obnoviť všetky tieto hodnoty na ich pôvodné hodnoty a nemôžem prísť na to, ako to urobiť správne. Môžem použiť samostatný struct, ktorá sa bude držať predvolené hodnoty a potom použiť func na zmenu hodnôt z jednej do príslušnej premennej v iných. Ale zdá sa, že nie je tak elegantné a tam musí byť krajší spôsob, ako to urobiť, aby som sa spamätala.

Snažil som sa pridať func vnútri struct, ktoré sa takto:

func resetDefaults() {
    self = DefaultStruct()
}

Kompilátor mi povedal, že nemôžem zmeniť seba a potrebujú, aby func mutating. Tak som to urobil. Ale potom inde v mojom kóde, v inej triedy, táto funkcia už nie je v pôsobnosti. Ak by som doplniť:

DefaultStruct.resetDefaults()

To mi dáva iné chyby, ako napr.:

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

Tiež, pretože som používať statické premenné tohto struct priamo, nikdy som inicializovaný tento struct. Inými slovami, nemám taký struct podľa názvu, že som si k inde. Alebo možno som zle a ja som niečo chýba???

Vaša pomoc bude veľmi ocenil. Buď som niečo chýba veľmi základné, alebo som si len použite samostatný struct s predvolené hodnoty ako som povedal predtým.

Vďaka!

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

Najlepšiu odpoveď

1

Ako veľmi triviálny príklad, ktorý dokazuje, že 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

Tento používa súkromné enum držať predvolené reťazcov tak, že (a) zostáva inernal na struct, aj keď sa používa v iných statické atribúty a (b) tak, že ho nemožno konkretizovať omylom.

Ak máte zložitejšie typ premennej, používať initialiser s predvolenú hodnotu, ktorá je intial / reset hodnotu, takže si môžete urobiť niečo ako 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

vďaka za vašu odpoveď. V 1. časti, budete mať "Počiatočné String" dvakrát, raz v deklarácie premenných a raz reset() funkcia. To je presne to, čo som sa chcel vyhnúť, ako keď budem musieť zmeniť niektoré predvolené hodnoty budem mať vždy pamätať na to v 2 miestach a to je príčinou chyby. Dúfal som, že by tam byť spôsob, ako definovať ju len raz v viac elegantný spôsob, ako. Ako pre 2. polovici, som si to vyskúšať a získať späť. Ešte raz vďaka. Je to veľká pomoc!
rafi

@rafí som možno urobil prvú časť príliš triviálne. Práve som aktualizované odpoveď na adresu táto.
flanker

ešte raz vďaka za tejto aktualizácie! Prvá časť je teraz podobné tomu, čo som si myslel, že by sme mali robiť, ale váš návrh pomocou enum a že tieto predvolené hodnoty vo vnútri rovnaké struct sama o sebe je výborný! Keďže sme robiť to isté, keď prehlasuje týchto premenných a pri resete ich hodnoty, dúfal som, že by sme mohli napísať tento kód len raz a potom sa možno mať initializer, ktoré by sa volať reset() funkcia, ale nechcel som podarí robiť to fungovať tak som skončil robí presne to, čo navrhol a ktorý teraz funguje perfektne. Tak ešte raz vďaka!
rafi

V iných jazykoch

Táto stránka je v iných jazykoch

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