如何在 Swift 中定义单例

How to define a Singleton in Swift

我正在使用以下代码定义单例:

class MySingleton {

    static let instance = MySingleton()

    private init() {}

    func example(myParameter:String) {

    }
}

这似乎工作正常,因为我可以正确执行以下调用:

MySingleton.instance.example(myParameter:"a string")

奇怪的是我也可以这样做:

MySingleton.example(self: MySingleton.instance)

我知道我已经定义了一个静态的 属性 来创建单例,但是函数 example 不是静态的,那么为什么我可以从 class 级别调用它?另外,请注意第二次调用的参数,它接收的不是函数中定义的 String 参数,而是 MySingleton.

类型的 self

正如我所见,如果函数被定义为私有,则不会发生这种情况,但显然我需要它 public 才能正确使用,那么,我定义错了什么?

虽然有人说这个问题已经在 SO 中得到了回答,但我认为有一些差异使这个问题独一无二,这就是我要回答它的原因。

我对 Singleton 的实现是完全正确的,并且描述了我所关心的问题,正如 Martin R 在评论中所说的那样,here。它被称为“Curried”函数,因为 link 会告诉你比我能告诉你的更多。

关于单例,据我所知,没有办法隐藏这些 "class" 方法。然而,我们也不应该太担心它,因为一些使用单例的官方 类(Apple 制作的)也表现出同样的行为。如果您想检查,我们这里有一些示例:

  • UserDefaults.standard
  • FileManager.default
  • URLSession.shared
  • OperationQueue.main
  • UIApplication.shared

所以基本上,如果您只是创建一个单例(并且您不熟悉 curried 函数)并且您看到了这种行为,请不要担心,这是正确的方法,并且有你的代码没有错。