这看起来可能是一个愚蠢的问题(对不起,如果是),但通常,在我的应用程序中,我有这个rootVC继承其他VC。所以来找我,我有这个根的倍数实例。例如,在AppDelegate
中,我将第一个视图称为:
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
,我可以在其中进行一些视图配置。但是,当我调用另一个也从我的root继承的VC(如InitialViewController
)时,我是从我的root创建新实例还是使用相同的?
你认为这是一个好习惯吗?
我正在阅读和搜索,但我无法在api参考中找到或理解:https://developer.apple.com/reference/uikit/uiviewcontroller
有什么建议吗?提前谢谢!
答案 0 :(得分:1)
为所有视图控制器设置一个公共子类可能很有用,但尽量不要给它带来太多负担。在可能和合理的情况下考虑使用组合而不是继承(Prefer composition over inheritance?)。
不要担心。如果您不在全局范围内使用静态变量或变量,那么视图控制器的每个实例都将是独立的。然后
SplashViewController
继承自RootViewController
,我可以在其中进行一些视图配置。但是,当我调用另一个也从我的root继承的VC(如InitialViewController
)时,我是从我的root创建新实例还是使用它?
答案 1 :(得分: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.
这就是我爱斯威夫特的原因:)。