如何在 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 函数)并且您看到了这种行为,请不要担心,这是正确的方法,并且有你的代码没有错。
我正在使用以下代码定义单例:
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 函数)并且您看到了这种行为,请不要担心,这是正确的方法,并且有你的代码没有错。