【发布时间】:2019-06-19 13:40:37
【问题描述】:
根据this blog post 和currently highest voted answer 到this Stack Overflow question,后者又引用Apple's documentation,在现代Swift 中创建单例的最佳方法是:
class Singleton {
static let sharedInstance = Singleton()
}
虽然没有提到,但可能也需要 private init()。
对我来说,更简单的替代方法是将所有属性和方法转换为 static,然后删除 sharedInstance 属性。
例如,假设我按照上面的建议编写了一个带有属性和方法的类,如下所示:
class Singleton {
static let sharedInstance = Singleton("whatever")
var myProperty: String
func myMethod() {
// ...
}
private init(_ myProperty) {
self.myProperty = myProperty
}
}
如果用户需要访问有问题的属性,他们会写Singleton.sharedInstance.myProperty,如果他们需要调用方法,他们会写Singleton.sharedInstance.myMethod()。
我建议重写类如下:
class Singleton {
static var myProperty: String = "whatever"
static func myMethod() {
// ...
}
}
因此:在访问属性(仅Singleton.myProperty)和方法(Singleton.myMethod())时,需要更少的样板代码和更少的字符。
一个缺点是从类内部访问属性和方法需要完全拼写出来(Singleton.myProperty 和 Singleton.myMethod()),而之前的解决方案只需要 myProperty 和 myMethod()。
因此,对用户来说更容易一些(删除sharedInstance 部分),对类编写者来说更难一些(需要在所有访问之前添加Singleton.)。当面对有利于用户或类编写者的设计选择时,更好的选择是有利于用户,这似乎是合理的。
似乎没有其他人支持我提出的制作单例的方法,所以我觉得它一定有问题。有人能指出这是什么吗?
【问题讨论】: