Как сбросить статические переменные в структуре до значений по умолчанию - Swift

0

Вопрос

У меня есть структура с некоторыми статическими переменными, которые мне нужно использовать во всем моем приложении (я еще не использовал одноэлементный класс, потому что в будущем мне может понадобиться несколько экземпляров, но сейчас у меня есть только один экземпляр).

Каждой статической переменной присваивается значение по умолчанию, но эти значения изменяются в течение всего срока службы приложения. Я также сохраняю эти изменения в действиях пользователя, чтобы они сохранялись между вызовами, но я все еще использую эти статические переменные, потому что не хочу каждый раз читать из действий пользователя.

Теперь мне нужна возможность сбросить все эти значения до их первоначальных значений по умолчанию, и я не могу понять, как это сделать правильно. Я могу использовать отдельную структуру, которая будет содержать значения по умолчанию, а затем использовать функцию для изменения значений с одного на соответствующую переменную в другом. Но это кажется не таким элегантным, и должен быть более приятный способ сделать это, которого мне не хватает.

Я попытался добавить функцию внутри структуры, которая выполняет следующее:

func resetDefaults() {
    self = DefaultStruct()
}

Компилятор сказал мне, что я не могу изменить себя и должен изменить функцию. Так я и сделал. Но затем в другом месте моего кода, в другом классе, эта функция больше не входит в область видимости. Если я добавлю:

DefaultStruct.resetDefaults()

Это дает мне другие ошибки, такие как:

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

Кроме того, поскольку я напрямую использую статические переменные этой структуры, я никогда не инициализировал эту структуру. Другими словами, у меня нет такой структуры по имени, к которой я мог бы получить доступ в другом месте. Или, может быть, я здесь ошибаюсь и что-то упускаю???

Ваша помощь была бы очень признательна. Либо мне не хватает чего-то очень простого, либо я просто буду использовать отдельную структуру со значениями по умолчанию, как я уже говорил ранее.

Спасибо!

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

Лучший ответ

1

В качестве очень тривиального примера, демонстрирующего концепцию

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

При этом используется частное перечисление для хранения строк по умолчанию, поэтому оно (а) остается внутренним для структуры, даже если используется другими статическими атрибутами, и (б) чтобы его нельзя было создать по ошибке.

Если у вас более сложный тип переменной, используйте инициализатор со значением по умолчанию, которое является начальным / сброшенным значением, чтобы вы могли сделать что-то вроде этого:

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

спасибо за ваш ответ. В 1-й части у вас есть "Начальная строка" дважды, один раз в объявлении переменной и один раз в функции reset (). Это именно то, чего я хотел избежать, так как если мне нужно будет изменить какое-то значение по умолчанию, я должен всегда помнить, что нужно делать это в 2 местах, и это является причиной ошибок. Я надеялся, что найдется способ определить это хотя бы один раз более изящным способом. Что касается 2-й половины, я попробую ее и вернусь. Еще раз спасибо. Это большая помощь!
rafi

@rafi Я, возможно, сделал первую часть слишком тривиальной. Я только что обновил ответ, чтобы решить эту проблему.
flanker

еще раз спасибо за это обновление! Первая часть теперь похожа на то, что я думал, что мне придется сделать, но ваше предложение использовать перечисление и поместить эти значения по умолчанию в саму структуру отлично! Поскольку мы делаем то же самое при объявлении этих переменных и при сбросе их значений, я надеялся, что мы сможем написать этот код только один раз, а затем, возможно, у нас будет инициализатор, который вызовет функцию reset (), но мне не удалось заставить ее работать, поэтому в итоге я сделал именно то, что вы предложили, и теперь это работает идеально. Так что еще раз спасибо!
rafi

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории