2017-05-19 10 views
1

シングルトンクラスでintオブジェクト変数を作成しようとしています。この私にObjCバージョン:Swift:シングルトンクラスのオブジェクト変数の初期化

+(MyClass*) single 
{ 
    static MyClass *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
     shareObject.myArray = [NSMutableArray new]; 
    }); 
    return shareObject; 
} 

スウィフトバージョン:私はmyarrayのが一回のinitさを知るにObjCバージョンの場合

class MyClass { 

    static let sharedInstance = MyClass() 
    var myArray = Array<Any>() 
} 

。しかし、スウィフト版の場合は、皆さんに私の質問。 myArray変数は一度initになりますか?

+0

'static'(またはグローバル)ストアド変数のアクセサは、実際には現在、Appleプラットフォームのフードの下で' dispatch_once'を使用しています(http://stackoverflow.com/q/43374222/2976878を参照)。 ) - Obj-C '+ single'メソッドと直接同等のものにします。 – Hamish

答えて

1

誰も手動でMyClassをインスタンス化できないように、プライベート初期化子を追加する必要があります。

class MyClass { 
    static let sharedInstance = MyClass() 

    var myArray = Array<Any>() 

    private init() {} 
} 

この方法は今までので、初期化子(= Array<Any>()は)一度だけ実行されます、MyClass(シングルトン)の一つのオブジェクトが存在することができます。これはスレッドセーフです。

+0

プライベートinit()を使用している場合。私は初期化子が私的な保護のために不得意になってしまっています。 ObjCサンプルのshareObject.myArray = [NSMutableArray new];配列は、コンテンツを保持するシングルトンによって使用されるすべてのクラスで使用できます – user2924482

+0

"私は初期化子がプライベートな保護のために不可能になっています"これがシングルトンの全面的ポイントです。あなたはオブジェクトの単一のインスタンス(あなたが名前をつけたような 'sharedInstance')を必要とします。 – Alexander

+0

MyClass.sharedInstance.myArrayを使用してシングルトンクラスの属性にアクセスする必要があります。myclassのオブジェクトを作成することはできません。そのインスタンスを取得しようとしています。エラーが発生しています。 –