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 AnalyticsProvider
ma 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!
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
PS Ho modificato la mia domanda per renderla un po 'più chiara (spero) in base alla risposta :) – deanWombourne