Come reimpostare le variabili statiche in una struttura per i loro valori di default - Swift

0

Domanda

Ho una struct con alcune variabili statiche che ho bisogno di usare tutta la mia app (non ho usato una classe singleton che ancora perché ho bisogno di più istanze in futuro, ma per ora ho solo questo singolo esempio).

Ogni variabile statica viene assegnato un valore di default, ma questi valori vengono modificati durante tutto il ciclo di vita dell'applicazione. Ho anche memorizzare questi cambiamenti in Utenteimpostazionipredefinite modo sarebbero persistente tra le chiamate, ma ho ancora utilizzare queste variabili statiche perché non ho voglia di leggere il Utenteimpostazionipredefinite ogni volta.

Ora voglio l'opzione per ripristinare tutti questi valori i valori predefiniti e io non riesco a capire come farlo correttamente. Posso usare una diversa struttura che conterrà i valori di default e quindi utilizzare una funzione per modificare i valori da una corrispondente variabile negli altri. Ma non sembra così elegante e ci deve essere un modo migliore di fare ciò che mi manca.

Ho provato ad aggiungere una funzione all'interno della struttura che esegue le seguenti operazioni:

func resetDefaults() {
    self = DefaultStruct()
}

Il compilatore mi ha detto che non può cambiare auto e la necessità di rendere il func e in continua mutazione. Così ho fatto. Ma poi altrove nel mio codice, in un'altra classe, questa funzione non è più nel campo di applicazione. Se posso aggiungere:

DefaultStruct.resetDefaults()

Mi da altri errori, come ad esempio:

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

Anche io uso le variabili statiche di questa struttura direttamente, non ho mai inizializzato questa struttura. In altre parole, non ho una struttura dal nome che posso accedere altrove. O forse ho sbagliato qui e mi sto perdendo qualcosa?????

Il vostro aiuto sarebbe molto apprezzato. O mi sto perdendo qualcosa di molto di base, o ti basta usare un separato struct con i valori di default come ho detto prima.

Grazie!

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

Migliore risposta

1

Come un banale esempio che illustra il concetto

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

Questo utilizza un enum privato per contenere le stringhe predefinite, quindi (a) rimane inernal per la struttura, anche se usato da altri attributi statici e (b) in modo che non può essere istanziata per errore.

Se si dispone di un più complesso per il tipo di variabile, utilizzare un initialiser con un valore di default è l'iniziale / valore di reset in modo che si può fare qualcosa di simile a questo:

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

grazie per la risposta. Nella 1 ° parte, si sono "Stringa Iniziale" due volte, una volta nella dichiarazione di variabile e, una volta in reset() funzione. Che è esattamente quello che volevo evitare, come se avrò bisogno di cambiare qualche valore di default devo sempre ricordare di farlo in 2 posti e che è causa di errori. Ho sperato che ci sarebbe un modo per definire solo una volta in un modo più elegante. Come per il 2 ° semestre, vado a provare e tornare. Grazie di nuovo. Questo è di grande aiuto!
rafi

@rafi ho forse fatto la prima parte troppo banale. Ho appena aggiornato la risposta per affrontare questo.
flanker

di nuovo grazie per questo aggiornamento! La prima parte è simile a quello che ho pensato di avere a che fare, ma il tuo suggerimento di usare un enum e mettendo questi valori di default all'interno di una stessa struttura in sé è eccellente! Dal momento che facciamo la stessa cosa quando la dichiarazione di tali variabili e, quando il reset loro valori, speravo che avremmo potuto scrivere questo codice solo una volta e poi magari hanno un inizializzatore che vorresti chiamare il reset() la funzione, ma non sono riuscito a farlo funzionare, così ho finito per fare esattamente quello che hai suggerito e che ora funziona perfettamente. Quindi grazie ancora!
rafi

In altre lingue

Questa pagina è in altre lingue

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