【问题标题】:Could a Swift Singleton be a class with purely class functionsSwift Singleton 可以是具有纯类函数的类吗
【发布时间】:2018-01-12 11:28:55
【问题描述】:

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

class MySingleton {

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

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

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

    // etc, etc...
}

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

【问题讨论】:

  • 是的 - 你可能是对的 - 我看的时候没发现
  • 要考虑的一种情况是,如果您需要“重置”您的单例,我的意思是将其恢复到初始状态。使用“正确”的单例,您可以删除当前实例并创建一个新实例,但是使用您的方法,您必须有某种方法来重置所有内容,并且很容易从中遗漏一些东西。
  • 一个问题是防止子类化,这可以通过使用final classstruct 来解决。另外,考虑最终隐藏你的初始化程序:stackoverflow.com/a/42569039/1033581

标签: swift singleton


【解决方案1】:

你想达到什么目的?

根据我的经验,如果

  • 您不想创建类的实例
  • 您不在乎,有人可以创建您的类的实例(这没有任何好处,但在技术上仍然可行)。
  • 对于所有实例,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 值。

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

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

【讨论】:

  • 谢谢 - 我应该说清楚,我完全熟悉创建单例和共享实例等的常规方法,我只是好奇为什么我们从不使用这种方法。我知道 Apple 自己使用 UIView.animate 来实现这一点,但我在其他地方并没有真正看到它。 Final 会很好,但对于实例化类,这似乎毫无意义。
  • 在我看来,如果任何东西都可以创建类的实例,那么它就不是真正的单例。它只是一个拥有自己共享实例的类。单例的想法是只有一个实例。并不是说这完全使您的观点无效,并且这种方法仍然有效。
【解决方案2】:

如果一个对象从未被实例化,它就不是一个单例。该对象有没有个实例,而不仅仅是一个实例。

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

编辑

让我吃惊的是,真正的比较是在一个只有类方法和全局函数的类之间。

在比较中,我看到的好处是名称间距。当你创建类方法时,你必须用类名来限定函数调用,所以你可以说

SomeClass.someMethod()

SomeOtherClass.someMethod()

这是 2 个不同的功能,并且很明显它们是不同的功能。

使用全局函数,您只需说

someMethod()

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

【讨论】:

  • 一个好处似乎是您不必实例化任何东西或担心私有初始化。我意识到它可以忽略不计,但不知何故它看起来更“诚实”。我知道这不是单例,但效果是一样的——也许我应该措辞更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2012-09-18
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多