Протоколно-ориентированное программирование, неявно вызывающее метод расширения
После моего первого взлома в 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)
}
}
Это работает, как я хочу, если я украшаю UIViewController с ReportPageViewedEvent
как это:
class HomeView: UIViewController, ReportPageViewedEvent {
Я получаю ошибку компилятора, если я не установил "pageName", что именно то, что я хочу.
Где я отклеиваюсь, где и как называть фактическое reportPageViewed()
метод. Я действительно хочу, чтобы это вызывали из viewDidLoad
это означает, что я должен либо модифицировать каждый 'viewDidLoad' в каждом контроллере, который его использует, либо создать подкласс и вызвать метод в суперклассе, который в первую очередь не поддается использованию POP.
Есть ли хороший способ добиться этого. Я не могу найти подобный пример в любом учебнике / блоге.
1 ответ
По сути, всегда есть какое-то поведение, которое разделяют все экраны вашего приложения. Поэтому целесообразно создать класс, называемый (например) BaseViewController, чтобы все остальные контроллеры представления наследовали его. В viewDidLoad BaseViewController вы можете вызвать метод reportPageViewed(). Однако такой подход делает протоколно-ориентированное программирование ненужным. Протоколы полезны, когда вам нужно назначить одно и то же поведение объектам, которые не имеют ничего общего (что не относится к экранам приложений).