面向协议的编程,隐式调用扩展方法

时间:2016-08-23 13:53:46

标签: ios swift uiviewcontroller protocol-oriented

第一次破解POP。在这种情况下,我想装饰一些UIViewControllers,以便任何他们自动提出的页面被查看'分析事件。

所以我为该协议创建了一个协议和扩展:

protocol ReportPageViewedEvent {
    func reportPageViewed()
    var pageName : String? { get set }
}

extension ReportPageViewedEvent where Self: UIViewController
{
    func reportPageViewed()
    {
        guard let pageName = self.pageName else
        {
            fatalError("UIViewController implements ReportPageViewEvent protocol but did not set pageName property")
        }
        let eventBusiness = EventBusiness.sharedInstance
        eventBusiness.logUserViewedPage(pageName)
    }
}

如果我用这样的ReportPageViewedEvent装饰一个UIViewController,这就像我想要的那样工作:

class HomeView: UIViewController, ReportPageViewedEvent {

我收到编译错误,除非我设置' pageName'这正是我想要的。

我失去的地方是在哪里以及如何调用实际的reportPageViewed()方法。我真的希望从viewDidLoad调用它,这意味着我要么必须修改每个' viewDidLoad'在每个使用它的控制器中,或子类并调用超类中的方法,该方法首先违背了使用POP的要点。

有没有很好的方法来实现这一目标。我无法在任何教程/博客中找到这样的例子。

1 个答案:

答案 0 :(得分:1)

基本上,应用的所有屏幕都会共享一些行为。因此,创建一个名为(例如)BaseViewController的类是合适的,这样所有其他视图控制器都将继承它。 在BaseViewController的viewDidLoad中,您可以调用reportPageViewed()方法。 但是,这种方法使得不需要面向协议的编程。当您需要为没有任何共同点的对象分配相同的行为时,协议非常有用(对于应用程序屏幕不是这种情况)。