我们的代码中有struct single,如下所示:
struct Foo {
let bar: String
static let sharedInstance = Foo(bar: "blah")
}
除了调用者仍然可以使用
初始化Foo实例的另一个实例之外,它工作得很好let foo = Foo.init(bar: "blah")
有没有办法让生成的初始化程序变为私有?
我们尝试明确定义初始化器,如下所示:
struct Foo {
let bar: String
static let sharedInstance = Foo(bar: "blah")
private init(bar: String) {
self.bar = bar
}
}
它有效,但它有点烦人,因为无论何时添加/更改属性,我们都必须再次修改初始化程序。我喜欢自动生成初始化程序的方式,我们不必编写这些锅炉代码。可能吗?
答案 0 :(得分:0)
如果您注意到实施:
struct Foo {
let bar: String
static let sharedInstance = Foo(bar: "blah")
}
即使没有给bar
一个初始值,是合法的,为什么?因为Swift Structs有一个默认初始化程序,名为成员初始化程序:
结构类型会自动接收成员初始值设定项 不要定义任何自己的自定义初始值设定项。与默认值不同 初始化程序,即使结构接收成员初始化程序 它存储了没有默认值的属性。
memberwise初始化程序是初始化成员的简便方法 新结构实例的属性。的初始值 新实例的属性可以传递给memberwise 按名称初始化。
这意味着如果您尝试创建Foo
struct的新实例,编译器应该 - 自动提供:
但是,您可以通过实现private init()
来摆脱它,但是您必须确保所有存储的属性都具有-dummy-初始值(或者可能让它们成为选项...)因为结构不再有一个初始化程序,用于保证存储的属性具有值。
它应该类似于:
struct Foo {
var bar: String = ""
static var shared = Foo()
private init() {}
}
备注: 我建议在实施单例模式时坚持使用类,您可能需要check this answer(谢谢至 MartinR提及它。)