0

ここに状況があります。私はプロトコルとその拡張機能を持っています。プロトコル指向プログラミング拡張変数init 2回

protocol CustomViewAddable { 
    var aView: UIView { get } 
    var bView: UIView { get } 
    func setupCustomView() 
} 
extension CustomViewAddable where Self: UIViewController { 
    var aView: UIView { 
     let _aView = UIView() 
     _aView.frame = self.view.bounds 
     _aView.backgroundColor = .grey 
     // this is for me to observe how many times this aView init. 
     print("aView: \(_aView)") 
     return _aView 
    } 
    var bView: UIView { 
     let _bView = UIView(frame: CGRect(x: 30, y: 30, width: 30, height: 30)) 
     _bView.backgroundColor = .yellow 
     return _bView 
    } 
    func setupCustomView() { 
     view.addSubview(aView); 
     aView.addSubview(bView); 
    } 
} 

は、そして私はViewControllerを、私は私のViewControllerのビューにこのカスタム「aView」を追加し、このプロトコルに準拠するために作ります。

class MyVC: UIViewController, CustomViewAddable { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupCustomView() 
    } 
} 

私はそれを実行します。私のコンソールログでは、initの2回印刷し、カスタム 'aView'で何かをしようとしていて、失敗しました。 (上に貼り付けたコードで、簡略化して自分の意図を表示するのがとても簡単になるでしょう)

誰かがなぜそれを説明するか、それに私が非常に感謝してくれるものを作ることができますか?

+0

あなたの 'print(" aView:\(_ aView) ")'が2回印刷されることを意味しましたか? –

答えて

1

あなたvar aView: UIViewは、変数が変数保管しないで計算されているので、

ですから、aViewを呼び出すたびに、それは新しいUIViewを作成し、

あなたがここにNSObjectAssociated Objectsを使用することができますが、いくつかのチュートリアルです:

これが役立つことを願っています。

+0

ありがとう、それは非常に明確な説明です! –

1

基本的にsetupCustomViewメソッドを実装した方法では、別の応答で説明したように、計算されたプロパティを使用しているため、このプロパティにアクセスするたびに再度作成されるためです。

あなたが望むものを達成するために関連する-オブジェクトまたはそのような何かを使用する必要はありません、あなただけのこのような方法で、再びそれを呼び出す回避冒頭でaViewの参照を保持する必要があります。

func setupCustomView() { 
    let tView = aView // only is computed once 
    view.addSubview(tView) 
    tView.addSubview(bView) 
} 

私はこれがあなたに役立つことを願っています。

関連する問題