私はSwiftとシングルトンクラスを作成する効率的な方法でシングルトンパターンについて学び、以下のように作成する最良の方法を見つけました。
class SingletonClass{
static let sharedInstance = SingletonClass()
}
私はlet
ステートメントを使用しているため、読み取り専用プロパティであり、スレッドセーフでなければならないため、Objective Cのようにdispatch_once()の必要はありません。そして、static
はsharedInstance
変数はclass
変数として推測します。
しかし、これはアプリケーション全体で作成されたインスタンスが1つだけであることをどのように保証しますか?
一度だけ作成されることを保証するのは、キーワードstaticです。この記事を参照できます: https://thatthinginswift.com/singletons/
お役に立てば幸いです。
Staticキーワードは、所属するクラスのインスタンス化を必要とせずにメンバー変数またはメソッドにアクセスできることを示します。簡単に言えば、それが属しているオブジェクトを作成したことがない場合でも、メソッドを呼び出すことができることを意味します
preventクラスのインスタンス化(効果的に使用をシングルトンのみに制限する)が必要な場合は、イニシャライザをprivate
としてマークします。
class SingletonClass {
static let shared = SingletonClass()
private init() {
// initializer code here
}
}
たとえば、プライベート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] = []
}
あなたが正しい。そして、あなたは Files and Initialization を読みたいと思うかもしれません。
Swiftはこのアプローチを使用します
遅延初期化、Javaのように、最初に参照されたときにグローバルの初期化子を実行します。
それは言う
カスタム初期化子、スタートアップ時間Swiftを使用すると、グローバルな初期化子を使用せずにクリーンにスケーリングでき、実行順序は完全に予測可能です。
グローバル変数の遅延イニシャライザー(構造体および列挙型の静的メンバー用)は、グローバルに初めてアクセスしたときに実行され、
dispatch_once
として起動されて、初期化がアトミックであることを確認します。これにより、コード内でdispatch_onceを使用するクールな方法が可能になります。初期化子でグローバル変数を宣言し、プライベートにするだけです。