2017-01-21 3 views
1

Может показаться немым вопросом (извините, если это так), но обычно в моих приложениях у меня есть этот rootVC для наследования с другими VC. Так пришел ко мне, что у меня есть экземпляры этого корня. Например, в AppDelegate я называю мой первый взгляд, как:Создание RootViewController для наследования со всеми другими VC - хорошая практика?

let window = UIWindow(frame: UIScreen.main.bounds) 
let root = SplashViewController(nibName: "SplashViewController", bundle: nil) 
window.rootViewController = UINavigationController(rootViewController: root) 
window.makeKeyAndVisible() 

self.window = window 

Тогда SplashViewController наследуется от моего RootViewController, где я могу сделать некоторые конфигурации представления. Но когда я вызываю другой VC (например, InitialViewController), который также наследуется от моего корня, я создаю новый экземпляр из моего корня или используя его? И вы думаете, что это хорошая практика?

Я читал и поиск, но я не мог найти или четко понимать, в ссылке апи: https://developer.apple.com/reference/uikit/uiviewcontroller

предложение? Заранее спасибо!

ответ

1

Наличие общего подкласса для всех контроллеров вашего вида может быть полезным, но старайтесь не слишком обременять его. Также рассмотрите возможность использования композиции вместо наследования, где это возможно и разумно (Prefer composition over inheritance?).

Тогда SplashViewController наследуется от моего RootViewController, где я могу сделать некоторые конфигурации представления. Но когда я вызываю другой VC (например, InitialViewController), который также наследуется от моего корня, я создаю новый экземпляр из моего корня или используя его?

Не беспокойтесь. Если вы не используете статические переменные или переменные в глобальной области, то каждый экземпляр ваших контроллеров будет независимым.

+0

Спасибо @werediver! На самом деле, я думаю, что никогда не слышал о композиции (или, возможно, использовал, но не знал). Итак, мой материнский класс, который я унаследую, будет тем видом? UIViewController? (не мог, правда?). Чтобы обеспечить создание этого корня (я использовал, но не думал об этом принципах), я не могу использовать статику? Не статирует ли мне только один экземпляр? Мое беспокойство заключается в создании экземпляра корня каждый раз, кроме вызова первого созданного - (генерирования утечек памяти). Если мне не ясно, извините, здесь ограниченный английский. – Gehlen

+0

@ Гелен, а также наследование - важная концепция ООП, поэтому попробуйте :) Дерево наследования может быть произвольной глубины, например 'UIViewController' - > 'MyBaseViewController' ->' SettingsScreenViewController'. Каждый экземпляр «SettingsScreenViewController» будет иметь все «MyBaseViewController» и «MyBaseViewController», но это не утечка, это по дизайну. Это позволяет каждому экземпляру 'SettingsScreenViewController' работать независимо. – werediver

+0

Nice @werediver! Моя концепция была неправильной, поэтому я посмотрю на композицию. Еще раз спасибо! – Gehlen

1

Это пример падения в anti patterns of OOPS. В Swift вы можете обратиться к этому с использованием протоколов.

Скажем, у вас есть общий класс для наследования, что, если какой-либо набор классов нуждается в специальной функции, которую другие не делают ?. Если вы решите добавить это в общий суперкласс, вы, как правило, раздуваете все другие подклассы, наследующие суперкласс. Если вы этого не сделаете, вам может понадобиться дублировать код.

Вы можете подойти к проблеме элегантно с использованием протоколов, я думаю, что это, как вы могли бы сделать,

protocol CommonTraits { } 
extension CommonTraits { // provide default implementations of common methods } 

protocol SpecialSetOfTraits { } 
extension SpecialSetOfTraits { // provide default implementations of common methods } 

Class A : CommonTraits {} // less bloating 
Class B : CommonTraits, SpecialSetOfTraits { } // Additional functionality. 

Вот почему я люблю Swift :)

Смежные вопросы