我有一个包含一些静态变量的结构,我需要在整个应用程序中使用这些变量(我还没有使用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()
}
}