2017-03-23 7 views
0

シングルトン/共有クラスの委譲メソッドの使用方法は? いくつかのプロトコルを定義したシングルトンクラスが1つありますが、他のクラスのデリゲート関数にアクセスする方法はわかりません。参照(SWIFT)のためのSwiftのシングルトンクラスの委任

コードスニペット:

protocol AClassDelegate 
{ 
    func method1() 
} 

class A 
{ 
    static let shared = A() 

    override init() { 
    //initialisation of member variables 
    } 

    var delegate: AClassDelegate 
    func foo() { 

    } 
} 


class B: AClassDelegate 
{ 
    func bar() { 
     // Note: not getting call to 'foo' method of class 'A' 
     A.shared.delegate = self 
     A.shared.foo() 
    } 
} 

は、この実装は正しいですか?

+1

参加者は常に弱いはずです。 –

+1

クラスAにプライベートinit()を追加して、常にシングルトンとして使用するようにしてください。現在、あなたはシングルトンではないA()も宣言することができます。 – totiG

+0

アドバイス:あなたのシングルトンのデリゲートを設定するクラス(クラスBなど)は許可しないでください。シングルトンがinit()時に使用するデリゲートを渡すことを強く検討する。あなたのシングルトンはデリゲートのメソッド1を呼び出して、何かを実行します。デリゲートとしてのクラスBは、シングルトンを設定する(または実際に呼び出す)べきではありません。 –

答えて

2

まず、私がポイントしたい:

の1-シングルトンクラスの作成すべき含まれています強制につながる

private init() {} 

だけその共有インスタンスを使用してクラスにアクセスします。

Max's Answerで述べたよう

2-、デリゲートは任意であると弱い基準を有するべきです。

protocol AClassDelegate: class 

詳細については、あなたがこのQ&Aチェックすることをお勧めします:次のように

、3-プロトコルは、クラスのタイプでなければなりません。今


、テストはAクラスからfoo()を呼び出すときにAClassDelegateからmethod1()が呼び出されるべきであることpurposes- -forのは想定してみましょう:

protocol AClassDelegate: class { 
    func method1() 
} 

class A { 
    private init() {} 
    static let shared = A() 

    weak var delegate: AClassDelegate? 

    func foo() { 
     print(#function) 

     delegate?.method1() 
    } 
} 

のはAClassDelegateに準拠したクラスを実装してみましょう:

class B: AClassDelegate { 
    func bar() { 
     A.shared.delegate = self 
     A.shared.foo() 
    } 

    func method1() { 
     print("calling the delegate method B Class") 
    } 
} 

class C: AClassDelegate { 
    func bar() { 
     A.shared.delegate = self 
     A.shared.foo() 
    } 

    func method1() { 
     print("calling the delegate method C Class") 
    } 
} 

出力は:

let b = B() 
b.bar() 
// this will print: 
/* 
foo() 
calling the delegate method B Class 
*/ 

let c = C() 
c.bar() 
// this will print: 
/* 
foo() 
calling the delegate method C Class 
*/ 

希望する必要があります。

+0

ステップバイステップフローのおかげでAhmed! – iTink

3

ほぼ正しいです。あなたはシングルトンが永遠に生きていることを考慮していませんが(あなたがどこかでそれを破壊しない限り)、代理人はそうではないかもしれません。だから、クラッシュを避けるためには、delegateプロパティをweakとオプションに設定してください。

このように、デリゲートが存在するかどうかは気にしないでください。

+0

ありがとうございました... – iTink