Swift如何使`struct`的默认初始值设定为private

时间:2017-05-16 14:50:44

标签: swift initialization singleton

我们的代码中有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
    }
}

它有效,但它有点烦人,因为无论何时添加/更改属性,我们都必须再次修改初始化程序。我喜欢自动生成初始化程序的方式,我们不必编写这些锅炉代码。可能吗?

1 个答案:

答案 0 :(得分:0)

如果您注意到实施:

struct Foo {
    let bar: String
    static let sharedInstance = Foo(bar: "blah")
}
即使没有给bar一个初始值,

是合法的,为什么?因为Swift Structs有一个默认初始化程序,名为成员初始化程序:

  

结构类型会自动接收成员初始值设定项   不要定义任何自己的自定义初始值设定项。与默认值不同   初始化程序,即使结构接收成员初始化程序   它存储了没有默认值的属性。

     

memberwise初始化程序是初始化成员的简便方法   新结构实例的属性。的初始值   新实例的属性可以传递给memberwise   按名称初始化。

这意味着如果您尝试创建Foo struct的新实例,编译器应该 - 自动提供:

enter image description here

但是,您可以通过实现private init()来摆脱它,但是您必须确保所有存储的属性都具有-dummy-初始值(或者可能让它们成为选项...)因为结构不再有一个初始化程序,用于保证存储的属性具有值。

它应该类似于:

struct Foo {
    var bar: String = ""
    static var shared = Foo()

    private init() {}
}

备注: 我建议在实施单例模式时坚持使用,您可能需要check this answer(谢谢至 MartinR提及它。)