web-dev-qa-db-ja.com

swiftでシングルトンオブジェクトを作成する方法

私はSwiftとシングルトンクラスを作成する効率的な方法でシングルトンパターンについて学び、以下のように作成する最良の方法を見つけました。

class SingletonClass{
    static let sharedInstance = SingletonClass()
}

私はletステートメントを使用しているため、読み取り専用プロパティであり、スレッドセーフでなければならないため、Objective Cのようにdispatch_once()の必要はありません。そして、staticsharedInstance変数はclass変数として推測します。

しかし、これはアプリケーション全体で作成されたインスタンスが1つだけであることをどのように保証しますか?

18
user4790024

一度だけ作成されることを保証するのは、キーワードstaticです。この記事を参照できます: https://thatthinginswift.com/singletons/

お役に立てば幸いです。

Staticキーワードは、所属するクラスのインスタンス化を必要とせずにメンバー変数またはメソッドにアクセスできることを示します。簡単に言えば、それが属しているオブジェクトを作成したことがない場合でも、メソッドを呼び出すことができることを意味します

9
wilforeal

preventクラスのインスタンス化(効果的に使用をシングルトンのみに制限する)が必要な場合は、イニシャライザをprivateとしてマークします。

class SingletonClass {

    static let shared = SingletonClass()

    private init() {
        // initializer code here
    }
}
23
Vatsal Manot

たとえば、プライベートinitを作成します。

final class Singleton {

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

    //MARK: Shared Instance

    static let sharedInstance: Singleton = Singleton()

    //MARK: Local Variable

    var emptyStringArray : [String] = []

}
4
YannSteph

あなたが正しい。そして、あなたは Files and Initialization を読みたいと思うかもしれません。

Swiftはこのアプローチを使用します

遅延初期化、Javaのように、最初に参照されたときにグローバルの初期化子を実行します。

それは言う

カスタム初期化子、スタートアップ時間Swiftを使用すると、グローバルな初期化子を使用せずにクリーンにスケーリングでき、実行順序は完全に予測可能です。

グローバル変数の遅延イニシャライザー(構造体および列挙型の静的メンバー用)は、グローバルに初めてアクセスしたときに実行され、dispatch_onceとして起動されて、初期化がアトミックであることを確認します。これにより、コード内でdispatch_onceを使用するクールな方法が可能になります。初期化子でグローバル変数を宣言し、プライベートにするだけです。

1
onmyway133