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



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

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

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

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

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?

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

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

谢谢!

作为演示概念的一个非常琐碎的例子

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()
}
}

最新更新