Jak zresetować zmienne statyczne w strukturze wartości domyślne - Swift

0

Pytanie

Mam struktura z niektórymi zmiennymi statycznymi, które muszę korzystać w całym moim aplikacji (ja jeszcze nie używałem jednoczęściowa klasa, bo w przyszłości może potrwać kilka egzemplarzy, ale teraz mam tylko jeden egzemplarz).

Każdej zmiennej statycznej ustawiany jest domyślny, ale wartości te zmieniają się w ciągu całego okresu użytkowania aplikacji. Ja również zapisuję te zmiany w działaniach użytkownika, aby przetrwały między połączeniami, ale ja wciąż używam te zmienne statyczne, bo nie chcę za każdym razem czytać z działań użytkownika.

Teraz potrzebuję opcję, aby zresetować wszystkie te wartości do ich pierwotnych wartości domyślnych, a ja nie mogę zrozumieć, jak to zrobić poprawnie. Mogę korzystać z oddzielną strukturę, która będzie zawierać wartości domyślne, a następnie użyć funkcji do zmiany wartości z jednego na odpowiednią zmienną w innym. Ale to chyba nie jest tak elegancki, i musi być bardziej przyjemny sposób, aby to zrobić, którego mi brakuje.

Próbowałem dodać funkcję wewnątrz struktury, która wykonuje następujące czynności:

func resetDefaults() {
    self = DefaultStruct()
}

Kompilator powiedział mi, że nie mogę zmienić siebie i musi zmienić funkcję. Więc tak zrobiłem. Ale potem w innym miejscu mojego kodu, w innej klasie, funkcja ta nie wchodzi w zakres. Jeśli dodam:

DefaultStruct.resetDefaults()

To daje mi inne błędy, takie jak:

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

Ponadto, ponieważ bezpośrednio używam zmienne statyczne tej struktury, nigdy nie инициализировал tę strukturę. Innymi słowy, u mnie nie ma takiej struktury według nazwy, do której mógłbym uzyskać dostęp w innym miejscu. Lub, być może, ja tu się mylę i coś mi umknęło???

Twoja pomoc była bym bardzo wdzięczna. Albo brakuje mi czegoś bardzo prostego, albo ja po prostu będę korzystać z oddzielną strukturę z domyślnymi wartościami, jak wspomniałem wcześniej.

Dziękuję!

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

Najlepsza odpowiedź

1

Jako bardzo trywialny przykład demonstrujący koncepcję

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

Wykorzystuje się przy tym prywatne pozycja do przechowywania ciągów domyślnie, więc ono (a) pozostaje wewnątrz struktury, nawet jeśli korzystasz z innymi statycznych atrybutów, oraz (b) aby nie można go było stworzyć w błędzie.

Jeśli masz bardziej skomplikowany typ zmiennej, użyj inicjator z wartością domyślną, która jest początkowym / zrzucane wartości, aby można było zrobić coś takiego:

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

dziękuję za odpowiedź. W 1. części masz "Początkowy wiersz" dwa razy, raz w deklaracji zmiennej i raz w funkcji reset (). To jest dokładnie to, czego chciałem uniknąć, bo jeśli będzie trzeba zmienić jakieś ustawienie domyślne, muszę zawsze pamiętać, że trzeba robić to w 2 miejscach, i to jest przyczyną błędów. Miałem nadzieję, że znajdzie się sposób, aby określić to, co najmniej raz bardziej elegancki sposób. Co do 2. połowy, spróbuję ją i wrócę. Jeszcze raz dziękuję. To wielka pomoc!
rafi

@rafi zrobiłem pierwszą część zbyt trywialne. Właśnie zaktualizowałem odpowiedź, aby rozwiązać ten problem.
flanker

jeszcze raz dziękuję za to aktualizacja! Pierwsza część teraz wygląda na to, że myślałem, że będę musiał zrobić, ale twoja propozycja użyć wyliczenie i umieścić te wartości domyślne w samą strukturę świetnie! Ponieważ robimy to samo po ogłoszeniu tych zmiennych i po zresetowaniu ich wartości, miałem nadzieję, że będziemy mogli napisać ten kod tylko raz, a następnie, być może, u nas będzie inicjator, który wywoła funkcję reset (), ale nie udało mi się zmusić go do pracy, więc w końcu zrobiłem dokładnie to, co sugeruje, i teraz to działa idealnie. Tak że jeszcze raz dziękuję!
rafi

W innych językach

Ta strona jest w innych językach

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