怎么重置静态变量的结构对它们的默认值-Swift

0

的问题

我有一个结构,一些静态变量那我需要用我的整个应用程序(我没有使用一个单独的类还没有,因为我可能需要多个实例,在未来,但是现在我只有这一个单一的实例)。

每个静态的分配的变量是一个默认的价值,但这些值得改变整个生命周期的应用程序。 我还保存这些变化UserDefaults,这样他们就可持续性之间调用,但我还是使用这些静态的变量的因为我不想读从UserDefaults每次。

现在我想可以选择重置所有这些数值来自原来的默认值和我可以弄清楚如何做到这一点正确。 我可以用一个单独的结构将举行的默认值,然后用一个功能改变的价值从一个到其各自的变量。 但它似乎不那么优雅而且必须有一个更好的方式来做到这一点,我丢失了。

我想添加一个功能的内部结构不会如下:

func resetDefaults() {
    self = DefaultStruct()
}

编译器告诉我我不能改变自我并需要使func变异。 所以我没有。 但随后在其他地方,在我的代码,在另一类中,这种功能不再在的范围。 如果我append:

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

这将使用一个私人枚举行的默认串使它(a)保持inernal的结构,即使是在通过其他的静态属性和(b)使得它无法实例通过的错误。

如果你有一个更复杂类型的变量,使用一个initialiser用默认值是头文字/重置价值,所以你可以做像这样的东西:

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部分,你有"初始String"两次,一次在可变项宣言和一旦在reset()function. 这正是我想要避免,因为如果我需要改变一些缺省值,我会永远记得这样做在2个地方这就是原因错误。 我希望会有一种方法来定义它只是一次在一个更优雅的方式。 至于第2半,我会尝试,并且回来。 再次感谢。 这是很大的帮助!
rafi

@拉菲我可能做了第一部分太微不足道。 我只是更新了的答案来解决这个问题。
flanker

再次感谢为这一更新! 第一部分是现在类似于我认为我必须做的,但是你建议使用一枚举,并把这些默认数值相同的结构本身就是极好的! 因为我们做同样的事情的时候,宣布这些变量和当重他们的价值观,我希望我们可以写这些代码只一次,然后也许有一个初始值,这将调reset()function,但是我没有成功地使其工作所以我做了什么你的建议,现在完美的作品。 所以再次谢谢你!
rafi

其他语言

此页面有其他语言版本

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