Singleton VS静态(类)变量

时间:2016-03-30 14:52:34

标签: ios swift macos

Swift的最佳做法是什么?

选项1:

class SomeManager {

    static var sharedManager = SomeManager()

    var someVariable: String?

}

然后

let something = SomeManager.sharedManager().someVariable

选项2:

class SomeManager {

    static var someVariable: String?

}

然后

let something = SomeManager.someVariable

1 个答案:

答案 0 :(得分:11)

TL;博士

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

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

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

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

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

静态变量

  • someVariable为常数时始终使用。
  • static var sharedManager = SomeManager()不需要额外存储空间;你只使用你真正需要的记忆。
  • 稍微快一些,因为您不需要将sharedManager加载到内存中,然后访问它的成员someVariable。您可以直接访问someVariable

奖金提示:

在选项2中,您可以创建SomeManager,即使它没有做任何事情。您可以通过将SomeManager转换为无枚举的枚举来阻止此操作。

enum SomeManager {
    static var someVariable: String?
}

你仍然可以这样做:

SomeManager.someVariable

但你不能这样做

let manager = SomeManger()