Singleton со свойствами в Swift 3

В Apple Используя Swift с Cocoa и Objective-C документом (обновленный для Swift 3), они приводят следующий пример шаблона Singleton:

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

        // setup code

        return instance
    }()
}

Предположим, что этот синглтон должен управлять переменным массивом строк. Как/где я могу объявить это свойство и убедиться, что он правильно инициализирован пустым массивом [String]?

Ответ 1

Для меня это лучший способ, сделайте 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] = []

}

Ответ 2

Вы можете инициализировать пустой массив, подобный этому.

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

Ответ 3

Согласно документации на яблоко: В Swift вы можете просто использовать свойство статического типа, которое гарантированно будет инициализироваться только один раз, даже если доступно несколько потоков одновременно.

class Singleton {

    // MARK: - Shared Instance

    static let sharedInstance = Singleton()
}

Или, с помощью метода инициализации:

class Singleton: NSObject {

    // MARK: - Shared Instance

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

    // MARK: - Initialization Method

    override init() {
        super.init()
    }
}

Ответ 4

Любая инициализация будет выполняться в методе init. Здесь нет никакой разницы между синглтоном и не одиночным.