2017-01-21 1 views
1

私のアプリでは、通常、私はこのrootVCに他のVCを継承させることがあります。だから、私はこのルートの複数のインスタンスを持っていることに私に来た。私はいくつかのビューの設定を行うことができます私のRootViewControllerから次にSplashViewController継承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 

:たとえば、AppDelegateに私は私の最初のビューを呼び出します。しかし、私のルートから継承する別のVC(InitialViewControllerのようなもの)を呼び出すと、私のルートから新しいインスタンスを作成しているか、同じものを使用していますか? それは良い習慣だと思いますか?

私は読書と検索が、私は見つけるか、APIリファレンスでは明確に理解することができませんでした。https://developer.apple.com/reference/uikit/uiviewcontroller

どんな提案を?前もって感謝します!

答えて

1

すべてのビューコントローラに共通のサブクラスを使用すると便利ですが、あまりにも多くの負担をかけないでください。可能であれば、継承の代わりにコンポジションを使用することも検討してください(Prefer composition over inheritance?)。

SplashViewControllerは、私がからいくつかのビュー構成を継承しています。しかし、私のルートから継承する別のVC(InitialViewControllerのようなもの)を呼び出すと、私のルートから新しいインスタンスを作成しているか、同じものを使用していますか?

心配はいりません。グローバルスコープ内の静的変数または変数を使用しない場合、ビューコントローラの各インスタンスは独立しています。

+0

は@werediverありがとうございます!実際に私は構成について聞いたことがないと思う(または、おそらく使用されていたが、知らなかった)。だから、私が受け継いでくれる母クラスは、どんな種類ですか? UIViewController? (できなかった、そう?)。そのルート(私は使用してきたが、このプリンシパルについては考えたことがない)を安全にするために、私は静的を使用できませんか?静的ではないインスタンス化は1つだけですか?私の心配は、最初に作成されたものを呼び出す以外に毎回ルートをインスタンス化することです(メモリリークを生成する)。もし私が明確でないなら、ここに限定して申し訳ありません。 – Gehlen

+0

@Gehlenの構成と継承はOOPの重要な概念ですので、試してみてください:)継承ツリーは 'UIViewController'のように任意の深さにすることができます - > 'MyBaseViewController' - >' SettingsScreenViewController'を実行します。 'SettingsScreenViewController'の各インスタンスは' MyBaseViewController'と 'MyBaseViewController'をすべて持ちますが、これはリークではなく、仕様です。これは、 'SettingsScreenViewController'の各インスタンスが独立して動作することを可能にします。 – werediver

+0

ニース@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. 

私はスウィフトを愛する理由です:)

関連する問題