web-dev-qa-db-ja.com

プロパティを持つシングルトンでSwift 3

Appleの CocoaとObjective-CのドキュメントでSwiftを使う (Swift 3用に更新)では、以下のSingletonパターンの例を示しています。

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

        // setup code

        return instance
    }()
}

このシングルトンが文字列の可変配列を管理する必要があると想像しましょう。どのように、どこでそのプロパティを宣言し、それが空の[String]配列に正しく初期化されるようにするのでしょうか。

86
RobertJoseph

私にとってはこれが最良の方法です、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]()

}
234
YannSteph

このように空の配列を初期化することができます。

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

Appleのドキュメントによると、 Swiftでは、単純に静的なtypeプロパティを使用することができます。これは、複数のスレッドに同時にアクセスした場合でも、1回だけ遅延初期化されることが保証されています

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

初期化メソッドを使って:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}
31
Mehul Sojitra

初期化はinitメソッドで行われます。ここではシングルトンと非シングルトンの間に違いはありません。

1
gnasher729