2016-03-24 7 views
0

Bir temsilci desen protokolü için birden fazla hedefi bildirmek üzere bir dağıtım programı uygulamaya çalışıyorum.Bir Swift 2 delege dağıtıcısı için kopyalama yöntemi adlarından kaçınmak istiyorsanız

Her desen adı için kopyala yapıştırmadan, aşağıdaki deseni yapmanın daha iyi bir yolu nedir?

Başvuru için
public class AirBatteryClientDelegateDispatcher: AirBatteryClientDelegate { 
    private var targets = [AirBatteryClientDelegate]() 

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

    . . . 
} 

, ben bir düzine ile aşağıdaki protokol kullanıyorum daha benzer yöntemler:

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

Neden bunun yerine bildirim tabanlı bir desen kullanmıyorsunuz? Bu şekilde tüm bu yöntemleri delegelere iletmek zorunda değilsiniz ... –

+0

Bildirimlerin kısa bir gecikme yaşadığını düşündüm. Kullanıcı arayüzü güncellemeleri için geri bildirimleri kullanıyorum. –

+0

Gözün UI güncellemeleri aracılığıyla yine de kayıt yapamayacağı mikro saniye beklemediğiniz sürece bunun bir sorun olmasını beklemiyorum. Yine de UI güncellemeleri için ana iş parçacığına göndermeniz gerekecek (bu da orada bir gecikme demektir). –

cevap

1

Sen zorunda kalacak Yansıma, boy-yönelimli programlama, bütün akla gelen meta-programlama Tüm delege yöntemlerini açık bir şekilde uygulayın, ancak en azından yineleme miktarını en az aynı şekilde uygulayarak azaltabilirsiniz. Bir Objective-C özelliği (opsiyonel protokol yöntemleri) kullanıyorsanız beri Etkili, sen Objective-C bu kodu yazıyoruz: Eğer gerçekten idi Ancak

@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 
} 

, hatta daha iyi olurdu Bu kodun, bu tür bir dinamik iletme için yapılan Objective-C'de yazılması. Daha zarif olabileceksin. Ama bunu nasıl yaptığınızı tarif etmeyeceğim, çünkü bize sorduklarınızdan çok uzaklaşacaktır.