Swift Singleton可以成为具有纯类函数的类

时间:2018-01-12 11:28:56

标签: swift singleton

这感觉就像讨论在几次Swift迭代之前停止了一样,但我很好奇,在讨论中,从未建议(或者如果我从未看过它)单身人士可能只是一个班级纯粹的类函数,例如 -

class MySingleton {

    private static var someVar: String?
    private static var someOtherVar: SomeType?

    class func start() {
        // etc...
    }

    class func doSomething() {
        // etc...
    }

    // etc, etc...
}

我们不应该这样做有什么好的理由吗?我无法想到任何事情。

2 个答案:

答案 0 :(得分:0)

如果一个对象从未实例化,那么它不是单例。 没有对象的实例,而不仅仅是单个实例。

这样做没有任何内在错误,但有什么好处?

修改

我觉得真正的比较是在只有类方法和全局函数的类之间。

在那次比较中,我看到的好处是名称间距。创建类方法时,必须使用类的名称限定函数调用,因此可以说

SomeClass.someMethod()

SomeOtherClass.someMethod()

这些是两个不同的功能,显而易见它们是不同的功能。

使用全局功能,您只需说

someMethod()

如果在将来某个日期你合并了另一个也有全局函数someMethod()的代码,你将得到一个关于重复函数的编译器错误,并且必须解决它。

答案 1 :(得分:0)

你想达到什么目的?

根据我的经验,你的方法很好,如果

  • 您不想创建班级实例
  • 你不在乎,有人可以创建你班级的实例(没有任何好处,但技术上仍然可行)。
  • someVarsomeOtherVar应包含始终所有实例的相同值。

另一种方法是拥有sharedInstance

class MySingleton {
    private(set) static var sharedInstance = MySingleton()
    private var someVar: String?
    private var someOtherVar: SomeType?

    func start() {
        // etc...
    }

    func doSomething() {
        // etc...
    }

    // etc, etc...
}

这为您提供了更大的灵活性。

  • 如果要使用共享实例,可以调用MySingleton.sharedInstance.start()
  • 但另一方面,您仍然可以创建自己的实例,例如let customInstance = MySingleton,并为someVarsomeOtherVar创建自己的值。

所以这真的取决于你想要达到的目标。如果你想确定,没有人可以使用自己的vars创建另一个实例,那么你的方法比我的方法更安全。

在这种情况下,您甚至可能要考虑使类成为final,因此没有人可以创建行为不同的子类。