【发布时间】:2016-03-11 17:54:22
【问题描述】:
我正在尝试在 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 协议但实际上并不包含任何方法的代码。
通过在AppAnalytics 中实现forwardInvocation:,我可以将方法转发给每个提供者,即
- (void)forwardImplementation:(NSInvocation *invocation) {
for provider in providers
if ([provider respondsToSelector:invocation.selector])
[invocation performWithTarget:provider]
}
通过在我的AppAnalytics 单例中不实现任何方法,调用会自动作为NSInvocation 传递到forwardImplementation:,但是因为AppAnalytics 符合协议,我在调用时获得了编译器安全性。赢赢。相当重要的是,我不必在 AppAnalytics 中实际实现任何方法,因为它们有 100 多个,我不想要那么多重复的代码!
鉴于 NSInvocation 是被禁止的,任何关于在 Swift 中实现此功能的好方法的想法!
【问题讨论】:
标签: ios objective-c swift