单例在Swift 3中具有属性

Rob*_*eph 87 singleton swift3

在Apple的使用Swift with Cocoa和Objective-C文档(针对Swift 3更新)中,他们给出了以下Singleton模式的示例:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()

        // setup code

        return instance
    }()
}
Run Code Online (Sandbox Code Playgroud)

让我们假设这个单例需要管理一个可变的字符串数组.如何/在哪里声明该属性并确保它被正确初始化为空[String]数组?

Yan*_*eph 235

对我来说这是最好的方法,让init私有化.Swift 3/4语法

// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray = [String]()

}
Run Code Online (Sandbox Code Playgroud)

  • 我赞成这个答案,但为了匹配Swift 3语法,"sharedInstance"应该改为"共享". (4认同)
  • @RomanN不能覆盖init,因为它不继承类.如果你能做到这一点,用这个例子```final class Singleton:NSObject {private override init(){}}``` (3认同)

小智 59

你可以像这样初始化一个空数组.

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton(array: [])
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]

    //MARK: Init

    init( array : [String]) {
        emptyStringArray = array
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢不同的方法,这个方法会很好.

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton()
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]? = nil

    //MARK: Init

    convenience init() {
        self.init(array : [])
    }

    //MARK: Init Array

    init( array : [String]) {
        emptyStringArray = array
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢单独的init方法作为`private`方法,甚至不是`internal`.这可以防止其他人为此类使用默认的'()'初始值设定项. (2认同)

Meh*_*tra 31

根据Apple的文档:在Swift中,您可以简单地使用静态类型属性,即使在同时跨多个线程访问时,也可以保证只延迟初始化一次.

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}
Run Code Online (Sandbox Code Playgroud)

用初始化方法:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 为什么init()不是私有的? (2认同)