面向协议编程,隐式调用扩展方法
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() 方法。
但是,这种方法不需要面向协议的编程。当您需要将一些相同的行为分配给没有共同点的对象时,协议很有用(应用程序屏幕不是这种情况)。
我第一次接触 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() 方法。 但是,这种方法不需要面向协议的编程。当您需要将一些相同的行为分配给没有共同点的对象时,协议很有用(应用程序屏幕不是这种情况)。