Метод Swizzling, чтобы сохранить чистоту реализации класса
Я нахожусь в ситуации, когда один из viewControllers моего приложения становится довольно большим, особенно потому, что я добавил "Состояние учебника", которое добавляет другую реализацию для многих методов этого класса, которые я контролирую, проверяя
_tutorialEnabled?
Итак, мой вопрос: если это хороший вариант использования метода swizzling, я мог бы разместить разные реализации этих методов в отдельной категории и, если необходимо, использовать их, это могло бы помочь мне уменьшить объем кода реализации по умолчанию. Любые комментарии или предложения других методов приветствуются.
3 ответа
Нет, это не то, для чего был разработан метод Swizzling.
Лично я хотел бы создать подкласс контроллера представления, который управляет учебными материалами. Затем, в зависимости от того, включен учебник или нет, вы создаете экземпляр контроллера учебника или его суперкласса. Для этого и был разработан полиморфизм: чтобы избежать бесконечного if
/else
/switch
эс.
Почему вы не подкласс? Создайте учебный подкласс вашего контроллера представления со всей необходимой логикой. Представьте учебник в реальном контроллере представления -viewDidAppear:
используя полноэкранный мод без анимации. Когда урок закончен, уволить модель без анимации.
if _tutorialEnabled != nil && _tutorialEnabled {
tutorialViewController = …
tutorialViewController.modalPresentationStyle = .FullScreen
presentViewController(tutorialViewController, animated: NO) {}
}
Нет, я бы не использовал метод Swizzling для этого. Это немного похоже на использование кувалды, чтобы постучать по кнопке.
В отличие от других, я также не стал бы создавать подкласс контроллера представления, поддержание понятного потока вокруг событий жизненного цикла представления действительно важно, когда вы хотите добавить другие функции позже.
Вместо этого я бы использовал шаблон стратегии для этого. В вашем init вы можете сделать что-то вроде этого:
if (tutorialEnabled) {
self.behaviour = [TutorialBehaviour new];
} else {
self.behaviour = [NormalBehaviour new];
}
Затем, когда вам нужно что-то изменить, вы просто вызываете метод для вашего поведения, например.
- (void)viewDidLoad
{
...
[self.behaviour load]
...
}