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

Protocol Oriented Programming, implicitly calling extension method

我第一次接触 POP。在这种情况下,我想装饰一些 UIViewControllers 以便它们自动引发 'Page viewed' 分析事件。

所以我创建了一个协议,以及该协议的扩展:

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',或者 subclass 并调用 super [=31 中的方法=] 这首先违背了使用 POP 的观点。

有什么好的方法可以做到这一点。我在 tutorial/blog.

中找不到这样的例子

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