2016-03-24 27 views
0

デリゲートパターンプロトコルを複数のターゲットに通知するディスパッチャを実装しようとしています。Swift 2デリゲートディスパッチャのコピー貼り付けメソッド名を避けたい

すべてのメソッド名のコピー貼り付けを行わずに、次のパターンを実行するより良い方法はありますか?反射、アスペクト指向プログラミング、メタプログラミングのすべての心に来る:参考

public class AirBatteryClientDelegateDispatcher: AirBatteryClientDelegate { 
    private var targets = [AirBatteryClientDelegate]() 

    public func clientDidStartScan(client: AirBatteryClient) { 
     for target in targets { 
      target.clientDidStartScan?(client) 
     } 
    } 

    . . . 
} 

を、私はダース以上の同様の方法で、以下のプロトコル使用しています:

@objc public protocol AirBatteryClientDelegate: class { 
    optional func clientDidStartScan(client: AirBatteryClient) 
    optional func clientDidStopScan(client: AirBatteryClient) 
    optional func clientDidUpdateState(client: AirBatteryClient) 
    . . . 
} 
+0

代わりに通知ベースのパターンを使用するのはなぜですか?そうすれば、これらのメソッドをデリゲートに渡す必要はありません。 –

+0

通知が短時間で済むと思いました。私は、UI更新のコールバックを使用しています。 –

+0

私はあなたの目がUIアップデートを使って登録することができないマイクロ秒を探していない限り、それが問題であるとは思わない。とにかくUI更新のためにメインスレッドにディスパッチする必要があります(遅延もあります)。 –

答えて

1

をあなたがする必要がありますすべてのデリゲートメソッドを明示的に実装しますが、同じ方法で実装することによって、繰り返しの量を少なくとも減らすことができます。あなたはObjective-Cの機能(オプションのプロトコルメソッド)を使用しているので、効果的に、あなたは Objective-Cでこのコードを書いている:あなたは本当にをした場合は

@objc protocol AirBatteryClientDelegate: NSObjectProtocol { // * 
    optional func clientDidStartScan(client: AirBatteryClient) 
    optional func clientDidStopScan(client: AirBatteryClient) 
    optional func clientDidUpdateState(client: AirBatteryClient) 
} 

class AirBatteryClientDelegateDispatcher { 
    private var targets = [AirBatteryClientDelegate]() 

    private func call(f:String, client:AnyObject) { 
     for target in targets { 
      let f = f + ":" // work around Swift bug 
      if target.respondsToSelector(Selector(f)) { 
       target.performSelector(Selector(f), withObject:client) 
      } 
     } 
    } 

    func clientDidStartScan(client: AirBatteryClient) { 
     call(#function, client:client) // or __FUNCTION__ before Swift 2.2 
    } 

    // ... and the others are identical 
} 

、それも良いだろうこの種の動的転送のために作られたObjective-Cにこのコードを書きます。あなたはもっとエレガントになります。しかし、私はあなたがあなたが尋ねたものからあまりにも遠くに私たちを取るように、あなたがそれをやる方法を説明しません。

関連する問題