2016-12-12 2 views
0

J'ai un modèle dans lequel je crée des UIViewControllers qui implémentent un certain protocole. Parce que j'ai besoin qu'ils soient de vrais UIViewControllers pour pouvoir les pousser sur la pile, ils doivent toujours être des UIViewControllers et non une classe aléatoire implémentant le protocole. Au début, j'ai pensé que je pouvais limiter le protocole, mais je ne pouvais pas comprendre cela. Si vous avez une idée de comment le résoudre à la source, ce serait encore mieux. Cependant, comme un type de retour, il me semblait que j'été plus chanceux:Protocole implémentant UIViewController en tant que paramètre ou type de retour

https://briancoyner.github.io/2015/11/14/swift-protocol-that-returns-protocol.html

protocol ModalViewControllerProvider { 

    typealias V: UIViewController, ModalPresentationCompletion 

    func viewControllerWithObject(object: AnyObject) -> V 
} 

Cet exemple ne fonctionne pas dans Swift 3 cependant, et je ne pouvais pas le faire fonctionner, sauf avec la composition de protocole, qui ne fonctionne pas pour UIViewController.

Je peux contourner ce problème en retournant un UIViewController puis en le castant vers ModalPresentationCompletion mais c'est un peu bizarre pour les autres programmeurs de le reconnaître. Est-ce que je peux assurer soit dans la déclaration du protocole lui-même, ou en créant quelque chose comme une typealias comme ci-dessus pour s'assurer qu'il est à la fois un UIViewController et qu'un certain protocole est toujours implémenté?

Répondre

1

Après les dernières modifications cet alias de type ressemble à ceci:

typealias V = UIViewController & ModalPresentationCompletion 

Testée à Swift 4

+0

Ce qui est nouveau à Swift 4 droite? Ou est-ce aussi la syntaxe Swift 3? –

+0

Maintenant, je ne peux pas vérifier sur Swift 3. Il peut fonctionner dans les deux dialectes mais je ne peux pas le garantir. – Alexey

+0

Eh bien, je ne m'intéressais plus à une réponse Swift 3 de toute façon! Donc merci! –