これが状況です。プロトコルとその拡張があります。
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 を作成し、このカスタム 'aView' を ViewController のビューに追加します。
class MyVC: UIViewController, CustomViewAddable {
override func viewDidLoad() {
super.viewDidLoad()
setupCustomView()
}
}
私はそれを実行します。コンソール ログに init が 2 回出力され、カスタム 'aView' で何かをしようとして失敗しました。(上に貼り付けたコードは、意図を示すのが非常に簡単になるように単純化したものです)
誰かが理由を説明したり、修正したりしていただければ幸いです。