2016-03-11 38 views
5

Sto provando a ri-implementare una classe in Swift, ma ho incontrato dei problemi. Il mio modello è di avere un singolo oggetto che inoltra i metodi in un protocollo a più altri oggetti.Selettore avanti a più oggetti in Swift

Ho un protocollo che assomiglia a:

@protocol AnalyticsProvider { 
@optional 

    - (void)showHomePage; 
    - (void)selectedMenuItem:(NSString *)item; 

    // ... 
    // 100 or so more methods :sigh: 
    // ... 

@end 

L'idea è che posso chiamare showHomePage su un Singleton e lo hanno trasmesso al più oggetti che ogni fare quello che vogliono con quel messaggio.

vorrei configurare il singleton all'avvio in questo modo:

[AppAnalytics sharedAnalytics] setProviders:@[ myFlurryProvider, myOmnitureProvider] ]; 

dove myFlurryProvider e myOmnitureProvider sono veri esecutori del protocollo AnalyticsProvider. E poi nei miei controller di vista avrei dovuto linee come questa:

[[AppAnalytics sharedAnalytics] showHomePage]; 

Questo dovrebbe inviare eventi homepage di analisi sia Flurry e Adobe Omniture, per esempio. Ciò funziona perché la classe AppAnalytics implementa il protocollo AnalyticsProviderma in realtà non contiene il codice per nessuno dei metodi.

Implementando forwardInvocation: in AppAnalytics posso inoltrare i metodi per ogni fornitore cioè

- (void)forwardImplementation:(NSInvocation *invocation) { 
    for provider in providers 
     if ([provider respondsToSelector:invocation.selector]) 
      [invocation performWithTarget:provider] 
} 

Evitando di mettere in atto qualsiasi dei metodi nella mia AppAnalytics Singleton le chiamate vengono automagicamente passati in forwardImplementation: come NSInvocation, ma perché AppAnalytics conforme al protocollo ottengo la sicurezza del compilatore al punto di chiamare. vinci. È abbastanza importante non dover implementare alcun metodo in AppAnalytics perché ce ne sono 100 e non voglio quel codice ripetuto!

Qualsiasi idea su un buon modo per implementare questo in Swift, dato che NSInvocation è vietato!

risposta

-2

Non sono sicuro di quale classe avesse il metodo forwardImplementation né da dove proviene l'elenco dei servizi, ma sembra che fornire implementazioni predefinite (che non fanno nulla) per ciascun metodo nel protocollo raggiungerebbe il tipo safety senza richiedere i metodi per effettivamente essere implementato in una delle classi conformi al protocollo.

+0

Sarebbe, ma ci sono oltre 100 metodi nel protocollo (è un'analisi per un'applicazione abbastanza grande) quindi vorrei evitare questo se possibile! L'elenco dei servizi viene creato nell'app delegato all'avvio. ForwardInvocation è nel singleton e funziona perché il singleton non implementa _any_ dei metodi del protocollo in modo che finiscano tutti in quel posto :) – deanWombourne

+0

PS Ho modificato la mia domanda per renderla un po 'più chiara (spero) in base alla risposta :) – deanWombourne

Problemi correlati