Swift单例可以是一个纯类函数的类吗

Swift单例可以是一个纯类函数的类吗,swift,singleton,Swift,Singleton,这感觉就像讨论在几次快速迭代之前就停止了,但我很好奇,在讨论中,从来没有人建议(或者如果我从来没有看到过的话)单例可以是一个纯类函数的类,例如- class MySingleton { private static var someVar: String? private static var someOtherVar: SomeType? class func start() { // etc... } class func doS

这感觉就像讨论在几次快速迭代之前就停止了,但我很好奇,在讨论中,从来没有人建议(或者如果我从来没有看到过的话)单例可以是一个纯类函数的类,例如-

class MySingleton {

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

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

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

    // etc, etc...
}

我们不应该这样做有什么好的理由吗?我想不出任何东西。

如果一个对象从未实例化过,它就不是单例对象。对象不存在任何实例,而不仅仅是一个实例

这样做本身没有什么错,但有什么好处呢

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

在这个比较中,我看到的好处是名称间距。当您创建类方法时,您必须使用类的名称限定函数调用,这样您就可以说

SomeClass.someMethod()

这是两个不同的函数,很明显,它们是不同的函数

对于全局函数,您只需说

someMethod()

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

您希望实现什么

根据我的经验,如果

  • 您不想创建类的实例
  • 您不在乎有人可以创建您的类的实例(这没有任何好处,但在技术上仍然是可能的)
  • someVar
    someOtherVar
    应始终包含所有实例的相同值
另一种方法是使用
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
    ,为
    someVar
    someOtherVar
    创建自己的值
所以这真的取决于你想要实现什么。如果您想确定,没有人可以用自己的变量创建另一个实例,那么您的方法比我的替代方法更安全


在这种情况下,你甚至可能想让这个类成为最终的,所以没有人可以创建一个行为不同的子类。

可能的副本是的-你可能是对的-我没有发现当我在看一个情况时要考虑的是,如果你需要重置你的单体,我的意思是把它返回到它的初始状态。使用“适当的”单例,您可以删除当前实例并创建一个新实例,但使用您的方法,您必须有某种方法重置所有内容,并且很容易从中遗漏一些内容。一个问题是防止子类化,这可以通过使用
final class
struct
来解决。另外,考虑隐藏你的初始化器:一个好处是你不需要实例化任何东西或者担心私有的信息。我意识到这是微不足道的,但不知何故,它看起来更“诚实”。我知道这不是一个单例,但效果是一样的-也许我应该把它写得更好。谢谢-我应该说清楚,我完全熟悉创建单例和共享状态等的正常方法,我只是好奇为什么我们从不使用这种方法。我知道苹果自己是用UIView.animate来做这件事的,但我在其他地方并没有看到过。Final会很好,但对于实例化类来说,这似乎毫无意义。在我看来,如果任何东西都可以创建类的实例,那么它就不是真正的单例。它只是一个拥有自己的共享实例的类。单身汉的想法是,单身汉只有一个例子。这并不是说你的观点完全无效,而且这种方法仍然有效。
class MySingleton {
    private(set) static var sharedInstance = MySingleton()
    private var someVar: String?
    private var someOtherVar: SomeType?

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

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

    // etc, etc...
}