//https://swiftrocks.com/writing-cleaner-view-code-by-overriding-loadview.html /// The HasCustomView protocol defines a customView property for UIViewControllers to be used in exchange of the regular view property. /// In order for this to work, you have to provide a custom view to your UIViewController at the loadView() method. public protocol HasCustomView { associatedtype CustomView: UIView } extension HasCustomView where Self: UIViewController { /// The UIViewController's custom view. public var customView: CustomView { guard let customView = view as? CustomView else { fatalError("Expected view to be of type \(CustomView.self) but got \(type(of: view)) instead") } return customView } } final class MyViewController: UIViewController, HasCustomView { typealias CustomView = MyView // <- Declare the type of your view so you don't have to cast it all the time override func loadView() { let customView = CustomView() customView.delegate = self view = customView } override func viewDidLoad() { super.viewDidLoad() customView.render() //some MyView method } }