具有 Swift 3 中属性的单例

Singleton with properties in Swift 3

在 Apple 的 Using Swift with Cocoa and Objective-C document(针对 Swift 3 进行了更新)中,他们给出了以下单例模式示例:

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

        // setup code

        return instance
    }()
}

让我们假设这个单例需要管理一个可变字符串数组。 How/where 我会声明 属性 并确保它正确初始化为空 [String] 数组吗?

任何初始化都将在 init 方法中完成。单例和非单例之间没有区别。

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

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
    }
}

或者,如果您喜欢不同的方法,这个方法也行。

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
    }
}

对我来说这是最好的方法,将 init 设为私有。 Swift 3\4\5语法

// 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]()

}

根据苹果的文档:In Swift, you can simply use a static type property, which is guaranteed to be lazily initialized only once, even when accessed across multiple threads simultaneously

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

初始化方法:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}