Синглтон со свойствами в Swift 3


в Apple использование Swift с Cocoa и Objective-C document (обновлено для Swift 3) они дают следующий пример Одноэлементного шаблона:

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

        // setup code

        return instance
    }()
}

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

4 80

4 ответа:

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

}

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

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

согласно документации apple:в 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()
    }
}

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