Próbuję ponownie zaimplementować klasę w Swift, ale mam problemy. Mój wzorzec ma mieć pojedynczy obiekt, który przekazuje metody w protokole do wielu innych obiektów.Przekazuje selektor do wielu obiektów w Swift
Mam protokół, który wygląda tak:
@protocol AnalyticsProvider {
@optional
- (void)showHomePage;
- (void)selectedMenuItem:(NSString *)item;
// ...
// 100 or so more methods :sigh:
// ...
@end
Pomysł jest, że mogę zadzwonić showHomePage
na Singleton i to przekazane do wielu obiektów, które każdy będzie robić swoje z tym komunikatem.
chciałbym skonfigurować singleton na starcie tak:
[AppAnalytics sharedAnalytics] setProviders:@[ myFlurryProvider, myOmnitureProvider] ];
gdzie myFlurryProvider i myOmnitureProvider są prawdziwe realizatorzy protokołu AnalyticsProvider
. I wtedy moim zdaniem kontrolerów musiałbym linie takie jak to:
[[AppAnalytics sharedAnalytics] showHomePage];
ten powinien wyślij Strona główna analityki wydarzenia zarówno Flurry i Adobe Omniture, na przykład. Działa to, ponieważ klasa AppAnalytics
implementuje protokół AnalyticsProvider
, ale w rzeczywistości nie zawiera kodu dla żadnej z metod.
Poprzez wdrożenie forwardInvocation:
w AppAnalytics
mogę przekazania metody do każdego IE dostawcy
- (void)forwardImplementation:(NSInvocation *invocation) {
for provider in providers
if ([provider respondsToSelector:invocation.selector])
[invocation performWithTarget:provider]
}
By nie implementacji żadnej z metod w moim AppAnalytics
Singleton połączenia są automagicznie przeszły do forwardImplementation:
jako NSInvocation
, ale ponieważ AppAnalytics
zgodny z protokołem otrzymuję bezpieczeństwo kompilatora w momencie wywoływania. wygrać wygraną. To dość ważne, że nie muszę implementować żadnych metod w AppAnalytics, ponieważ jest ich 100 i nie chcę tego zbyt wiele powtórzeń!
Wszelkie pomysły na dobry sposób wdrożenia tego w Swift, z uwagi na to, że NSInvocation
jest zabronione!
To by było, ale w protokole jest ponad 100 metod (to analizy dla dość dużej aplikacji), więc chciałbym tego uniknąć, jeśli to możliwe! Lista usług jest tworzona w delegacie aplikacji podczas uruchamiania. Wywołanie forward jest w singleton i działa, ponieważ singleton nie implementuje _na_ metod protokołu, więc wszystkie one kończą w tym jednym miejscu :) – deanWombourne
PS Zmodyfikowaliśmy moje pytanie, aby było ono nieco jaśniejsze (mam nadzieję) na podstawie Twojej odpowiedzi :) – deanWombourne