2017-05-18 5 views
0

iOS swiftのデリゲートパターンを理解し始めたばかりです。私が間違っている場合は私を訂正しますが、私の理解はここにあります:デリゲートは、複数の適合がある場所で関数を呼び出す場所をどのように知っていますか?

委任パターンは、あるジョブと1つのジョブだけを持つクラスを維持するためにタスクを別のクラスに委譲するために使用され、この仕事に責任を持つクラス。今ここに混乱を招く部分です:

protocol Addition { 
    func addTwoNumbers(_ number1: Int, _ number2: Int) 
} 

class A: Addition { 

    func addTwoNumbers(_ number1: Int, _ number2: Int) { 
     print("The number is: \(number1 + number2)") 
    } 
} 

class B { 

    let apple = 10 
    let orange = 20 

    var delegate: Addition? 

    func runAddition() { 
     delegate?.addTwoNumbers(apple, orange) 
    } 
} 

let bob = B() 
bob.runAddition() 

クラスBは、追加のタスクを実行する必要があり、代わりに機能を実装するので、私は、クラスAは、プロトコルを介して仕事をするもらおう。今私は混乱しているところです。クラスBはfunc addTwoNumbers関数の実行場所をどのように知っていますか?私はクラスCと呼ばれる別のクラスを持つことができ、Additionプロトコルに準拠することができます。今度はAdditionプロトコルに準拠した2つのクラスがあります。

ありがとうございました!

+4

わかりません。コードを実行すると、addTwoNumbers()が呼び出されないことがわかります。あなたは* bob.delegateに値を*割り当てる必要があります - つまり、*あなた*はbobに呼び出しを委譲するように指示します。 –

答えて

1

runAddition()クラスのメソッドBを呼び出すと、delegateに値が設定されていないため、何も実行されません。

あなたは Additionプロトコルを実装している任意のクラスのインスタンスを割り当てる必要があり、それを動作させるために。

let calculator1 = Calculator1() 
let calculator2 = Calculator2() 

class Calculator1: Addition { 

    func addTwoNumbers(_ number1: Int, _ number2: Int) { 
     print("Inside Calculator1 addTwoNumbers method") 
     // The rest of your code 
    } 
} 

、今

class Calculator2: Addition { 

    func addTwoNumbers(_ number1: Int, _ number2: Int) { 
     print("Inside Calculator2 addTwoNumbers method") 
     // The rest of your code 
    } 
} 

は、先ほどのクラスの2つのオブジェクトを作成してみましょう:

我々はAdditionプロトコルを実装する2つのクラスがあり、たとえばましょうクラスBのインスタンスを作成しましょう:

let bob = B() 

さて、bobのデリゲートを設定し、runAddition()メソッドを呼び出してみましょう:

bob.delegate = calculator1 
bob.runAddition() 

ここrunAddition()の出力は次のようになります。

インサイドCalculator1 addTwoNumbers方法

今、別の再度、デリゲートの値、およびコールrunAddition()

bob.delegate = calculator2 
bob.runAddition() 

ここrunAddition()の出力は次のようになります。

インサイドCalculator2のaddTwoNumbers方法

ホープ、このことができます!

+0

ありがとうございます!すべてクリアされた! –

関連する問題