Singleton VS静态(类)变量

Art*_*tov 13 macos ios swift

Swift的最佳实践是什么?

选项1:

class SomeManager {

    static var sharedManager = SomeManager()

    var someVariable: String?

}
Run Code Online (Sandbox Code Playgroud)

然后

let something = SomeManager.sharedManager().someVariable
Run Code Online (Sandbox Code Playgroud)

选项2:

class SomeManager {

    static var someVariable: String?

}
Run Code Online (Sandbox Code Playgroud)

然后

let something = SomeManager.someVariable
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 11

TL;博士

存储可变状态时的选项1(类或结构),因为您需要其他实例.

当您想要存储静态变量时,选项2(作用域全局变量)因为它更快并且使用更少的内存.

带变量的单例类(或结构)

全球国家通常被认为是"坏事".这很难思考,导致问题,但有时是不可避免的.

  • 如果您想要拥有多个SomeManager实例,请创建一个类.
  • 单例可以是良好的默认实例,但可能存在您希望具有单独行为(测试)的边缘情况.
  • 依赖注入...是SomeManager存储全局状态时相关的重要主题.

静态变量

  • 总是在someVariable恒定时使用.
  • 不需要额外的存储空间static var sharedManager = SomeManager(); 你只使用你真正需要的内存.
  • 稍微快一些,因为您不需要加载sharedManager到内存中然后访问它的成员someVariable.你直接访问someVariable.

额外提示:

在选项2中,SomeManager即使它没有做任何事情,您也可以创建.你可以通过变成SomeManager没有案例的枚举来防止这种情况.

enum SomeManager {
    static var someVariable: String?
}
Run Code Online (Sandbox Code Playgroud)

你仍然可以这样做:

SomeManager.someVariable
Run Code Online (Sandbox Code Playgroud)

但你不能这样做

let manager = SomeManger()
Run Code Online (Sandbox Code Playgroud)

  • 关于奖金提示,您实际上可以通过实现私有init来实现.这实际上是您应该为任一选项做的事情.只需添加`private init(){}`. (5认同)
  • 我没有意识到,谢谢 (2认同)