如何将结构中的静态变量重置为其默认值 - Swift

How to reset static variables in a struct to their default values - Swift

我有一个包含一些静态变量的结构,我需要在整个应用程序中使用它们(我还没有使用单例 class 因为我将来可能需要多个实例,但现在我只是有这个单一实例)。

每个静态变量都被分配了一个默认值,但这些值在应用程序的整个生命周期中都会发生变化。 我还将这些更改存储在 UserDefaults 中,以便它们在调用之间保持不变,但我仍然使用这些静态变量,因为我不想每次都从 UserDefaults 中读取。

现在我想要将所有这些值重置为其原始默认值的选项,但我不知道如何正确执行此操作。 我可以使用一个单独的结构来保存默认值,然后使用一个函数将值从一个更改为另一个中的相应变量。但它似乎不是那么优雅,必须有一种更好的方法来做到这一点,我错过了。

我试图在结构中添加一个函数,它执行以下操作:

func resetDefaults() {
    self = DefaultStruct()
}

编译器告诉我我不能改变 self 并且需要使 func 变异。所以我做了。 但是在我的代码的其他地方,在另一个 class 中,这个函数不再在范围内。如果我追加:

DefaultStruct.resetDefaults()

它给我其他错误,例如:

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

另外,因为我直接使用了这个结构体的静态变量,所以我从来没有初始化过这个结构体。换句话说,我没有可以在其他地方访问的名称结构。或者也许我在这里错了,我错过了什么???

非常感谢您的帮助。要么我遗漏了一些非常基本的东西,要么我将像我之前所说的那样使用具有默认值的单独结构。

谢谢!

作为一个非常简单的例子来演示这个概念

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

这使用私有枚举来保存默认字符串,因此它 (a) 仍然是结构内部的,即使在被其他静态属性使用时也是如此,并且 (b) 这样它就不会被错误地实例化。

如果变量的类型更复杂,请使用默认值为初始值/重置值的初始化程序,这样您就可以执行以下操作:

struct Foo {
   struct ComplexStruct{
       var x: SomeType

       init(x: SomeType = DefaultValue) { self.x = x }
   }

   static var bar = ComplexStruct()
   
   static func reset() {
      bar = ComplexStruct()
   }
}