2016-03-11 19 views
5

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!

Odpowiedz

-2

Nie jestem pewien, która klasa miała metodę przekazania do przodu, ani skąd pochodzi lista usług, ale wydaje się, że dostarczenie domyślnych implementacji (które nic nie dają) dla każdej metody w twoim protokole zapewniłoby bezpieczeństwo typu bez konieczności stosowania metod. w rzeczywistości będą realizowane w dowolnej klasie zgodnej z protokołem.

+0

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

+0

PS Zmodyfikowaliśmy moje pytanie, aby było ono nieco jaśniejsze (mam nadzieję) na podstawie Twojej odpowiedzi :) – deanWombourne

Powiązane problemy