Программно-ориентированное программирование, неявно вызывающий метод расширения

78
12

У меня первая трещина в 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.

Есть ли хороший способ достичь этого. Я не могу найти такой пример в любом учебнике/блоге.

спросил(а) 2021-01-25T15:01:08+03:00 4 месяца, 2 недели назад
1
Решение
63

В принципе, на всех экранах вашего приложения всегда присутствует какое-то поведение. Поэтому уместно создать класс, называемый (например) BaseViewController, чтобы все остальные контроллеры представления наследовали его. В BaseViewController viewDidLoad вы можете вызвать метод reportPageViewed(). Однако этот подход не требует программирования, ориентированного на протоколы. Протоколы полезны, когда вам нужно назначить такое же поведение объектам, которые не имеют ничего общего (что не относится к экранам приложений).

ответил(а) 2021-01-25T15:01:08+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема