Protocole Swift pour les sous-classs UIViewController

Est-il possible de déclarer un protocole et aussi de définir le type d'object qui peut s'y conformer?

J'ai un set de fermetures que je voudrais configurer dans différentes sous-classs de UIViewController dans mon projet. (Ils sont tous liés).

Je voudrais avoir une fonction d'usine qui crée le type correct de sous-class UIViewController mais le renvoie ensuite comme un type de protocole.

De cette façon, je peux ensuite configurer les différentes fermetures et pousser le controller de vue sur le controller de navigation.

Je peux soit …

Renvoyez la superclass UIViewController et poussez-la sur la stack de navigation, mais ne pourrez pas définir les fermetures correctement car le compilateur ne sait pas qu'il est conforme au protocole.

ou…

Retourne le type de protocole et je suis capable de définir les fermetures correctement mais le compilateur ne sait pas qu'il s'agit d'une sous-class UIViewController donc je ne peux pas le pousser sur le controller de navigation.

Y a-t-il un moyen de faire les deux?

Merci

En Objective C, vous étiez en mesure de déclarer une variable comme ceci:

 UIViewController <Protocol> *variable; 

Malheureusement, ce n'est pas possible avec Swift, qui, étant donné que Swift est orienté sur le protocole, c'est très étrange.

C'est assez inconfortable parce que comme vous l'avez découvert, le compilateur ne peut pas être conscient de la class et du protocole en même time, donc vous devez lancer deux fois, vous devez vérifier que l'object est de la class autorisée à l'exécution , et devez le documenter dans votre code pour empêcher les gens d'envoyer le mauvais type d'object.

Oui, vous pouvez! Fais-le comme ça..

// un protocole pour s'assurer que l'object conforme est sous-class de UIViewController

protocole public IamViewController {}

// fait en sorte que chaque UIViewController adopte le protocole IamViewController

extension UIViewController: IamViewController {}

// crée votre protocole et ajoute une exigence selon laquelle il doit être UIViewController s'il veut s'y conformer

protocole vcObject: IamViewController {}