How do I declare a variable that has a type and implements a protocol?

I think you can get there by adding an (empty) extension to UIViewController and then specifying your detailViewController attribute using a composed protocol of the empty extension and your DetailViewController. Like this:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

Now all subclasses of UIViewController satisfy protocol UIViewControllerInject. Then with that, simply:

typealias DetailViewControllerComposed = protocol<DetailViewController, UIViewControllerInject>

class MasterViewController : UITableViewController {
  var detailViewController : DetailViewControllerComposed?
  // ...
}

But, this is not particularly ‘natural’.

=== Edit, Addition ===

Actually, you could make it a bit better if you define your DetailViewController using my suggested UIViewControllerInject. Like such:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

protocol DetailViewController : UIViewControllerInject { /* ... */ }

and now you don’t need to explicitly compose something (my DetailViewControllerComposed) and can use DetailViewController? as the type for detailViewController.

Leave a Comment