将选择器转发到Swift中的多个对象

时间:2016-03-11 17:54:22

标签: ios objective-c swift

我试图在Swift中重新实现一个类,但遇到了问题。我的模式是拥有一个对象,它将协议中的方法转发给多个其他对象。

我有一个看似如下的协议:

@protocol AnalyticsProvider {
@optional

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

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

@end

我的想法是,我可以在单身人士上调用showHomePage并将其转发给多个对象,每个对象都会使用该消息自行处理。

我会在启动时配置单例:

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

其中myFlurryProvider和myOmnitureProvider是AnalyticsProvider协议的真正实现者。 然后在我的视图控制器中,我会有这样的行:

[[AppAnalytics sharedAnalytics] showHomePage];

例如,这应该将主页分析事件发送到Flurry和Adobe Omniture。这是有效的,因为AppAnalytics类实现了AnalyticsProvider协议,但实际上并不包含任何方法的代码

forwardInvocation:中实施AppAnalytics我可以将方法转发给每个提供者,即

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

通过不在AppAnalytics单例中实现任何方法,调用会自动作为forwardImplementation:传递到NSInvocation,但因为AppAnalytics符合我获得的协议编程时的编译安全性。赢了。它非常重要我不必在AppAnalytics中实际实现任何方法,因为有100多个方法,我不想要那么多重复的代码!

有关在Swift中实现此功能的好方法的任何想法,因为NSInvocation是被禁止的!

1 个答案:

答案 0 :(得分:-2)

我不确定哪个类有forwardImplementation方法,也没有服务列表的来源,但似乎为协议中的每个方法提供默认实现(什么都不做)可以实现类型安全而不需要方法实际上在任何符合协议的类中实现。