我试图在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
是被禁止的!
答案 0 :(得分:-2)
我不确定哪个类有forwardImplementation方法,也没有服务列表的来源,但似乎为协议中的每个方法提供默认实现(什么都不做)可以实现类型安全而不需要方法实际上在任何符合协议的类中实现。