Cum să resetați variabile statice într-un struct la valorile lor implicite - Swift

0

Problema

Am o struct cu unele variabile statice de care am nevoie pentru a utiliza de-a lungul aplicația mea (nu am folosit-o clasa singleton încă pentru că am nevoie de mai multe instanțe, în viitor, dar acum am doar acest singur exemplu).

Fiecare variabilă statică este atribuit o valoare implicită, dar aceste valori s-a schimbat pe toată durata de viață a aplicației. Am stoca, de asemenea, aceste schimbări în UserDefaults astfel încât acestea să fie persistente între invocații, dar eu încă mai folosesc aceste variabile statice pentru că nu vreau să citesc din UserDefaults de fiecare dată.

Acum vreau opțiunea de a reseta toate aceste valorile lor inițiale valorile implicite și eu nu pot da seama cum de a face acest lucru corect. Pot folosi separat struct care va deține valorile implicite și apoi utilizați o func pentru a schimba valorile de la unul la respectiva variabilă în cealaltă. Dar se pare că nu atât de elegant și trebuie să existe o modalitate mai buna de a face acest lucru care îmi lipsește.

Am încercat pentru a adăuga o func interiorul struct care face următoarele:

func resetDefaults() {
    self = DefaultStruct()
}

Compilatorul mi-a spus că nu se poate schimba de sine și au nevoie pentru a face func mutant. Așa am și făcut. Dar apoi în altă parte în codul meu, într-o altă clasă, această funcție nu mai este în domeniul de aplicare. Dacă am adăuga:

DefaultStruct.resetDefaults()

Imi da alte erori, cum ar fi:

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

De asemenea, pentru că am folosi variabilele statice de acest struct direct, n-am inițializat acest struct. Cu alte cuvinte, nu au astfel o struct de nume care pot accesa în altă parte. Sau poate am greșit și am pierdut ceva???

De ajutorul tau va fi foarte apreciat. Ori eu sunt lipsește ceva foarte de bază, sau o voi folosi separat struct cu valorile implicite după cum am spus înainte.

Multumesc!!!

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

Cel mai bun răspuns

1

Ca un exemplu banal, care demonstrează conceptul

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

Acesta utilizează un privat enum să dețină default sfori ca să-l (o) rămâne inernal la struct, chiar și atunci când sunt utilizate de către alte atribute statice și (b), astfel încât acesta nu poate fi instanțiată de greșeală.

Dacă aveți un tip mai complex de variabile, utilizați un initialiser cu o valoare implicită care este intial / resetare valoare astfel încât să puteți face ceva de genul asta:

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ă mulțumim pentru răspunsul dumneavoastră. În partea 1, trebuie "Inițial Șirul" de două ori, o dată în declarație de variabilă și o dată în reset() funcția. Asta e exact ceea ce am vrut pentru a evita ca daca voi avea nevoie pentru a schimba unele valoare implicită va trebui să ne amintim întotdeauna să-l facă în 2 locuri și asta e cauza pentru erori. Am sperat că ar fi o modalitate de a defini doar o dată într-un mod mai elegant. Cum pentru a 2-a jumătate, am să-l încercați și de a lua înapoi. Multumesc din nou. Acest lucru este de mare ajutor!
rafi

@rafi e posibil să fi făcut prima parte prea banal. Am actualizat doar răspunsul la adresa asta.
flanker

multumesc din nou pentru această actualizare! Prima parte este acum similar cu ceea ce am crezut că trebuie să fac, dar sugestia ta de a folosi un enum și de a pune aceste valori implicite în același struct sine este excelent! Când ne-am face același lucru atunci când declararea acestor variabile și atunci când resetarea valorilor lor, am sperat că am putea scrie acest cod doar o singură dată și atunci poate avea o inițializare, care ar suna reset() funcția, dar nu am reușit în a face să funcționeze așa am ajuns să fac exact ce mi-ai sugerat și că acum merge perfect. Deci multumesc din nou!
rafi

În alte limbi

Această pagină este în alte limbi

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