如何将结构中的静态变量重置为其默认值 - 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()
}
}
我有一个包含一些静态变量的结构,我需要在整个应用程序中使用它们(我还没有使用单例 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()
}
}