【问题标题】:Forward selector to multiple objects in Swift将选择器转发到 Swift 中的多个对象
【发布时间】: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 和 Adob​​e 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


    【解决方案1】:

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

    【讨论】:

    • 会,但协议中有超过 100 种方法(它是针对相当大的应用程序的分析),所以如果可能的话,我想避免这种情况!服务列表是在启动时在应用委托中创建的。 forwardInvocation 在单例中,它之所以有效,是因为单例没有实现 any 协议方法,所以它们都在一个地方结束:)
    • PS 我已经根据您的回答编辑了我的问题,使其更清晰(我希望):)
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2023-03-06
    相关资源
    最近更新 更多