2017-08-02 3 views
3

Vous ne savez pas si c'est une manière étrange de le faire mais dans Swift 3 je veux vérifier si un objet est un UIViewController et est conforme à mon protocole Transitionable. J'ai:Vérifiez si un objet est une classe spécifique et conforme à un protocole

guard let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to), 
    let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from), 
    let toTransitionable = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? Transitionable, 
    let fromTransitionable = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as? Transitionable 
else { 
    transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
    return 
} 

Mais j'espérais que je pourrais obtenir et objet qui est à la fois UIViewController et Transitionable pour le vers et à partir. i essayé let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? Transitionable as? UIViewController mais qui garde comme un simple UIViewController

J'ai aussi essayé:

extension Transitionable where Self: UIViewController { 
    var viewController: UIViewController { return self } 
} 

Mais j'obtiens l'erreur: 'Transitionable' is not a subtype of 'UIViewController' quand je l'appelle par exemple toTransitionable.viewController

transitionContext.containerView.addSubview(toTransitionable.viewController.view) 

Je comprends que nous pouvons faire as? (UIViewController & Transitionable) à Swift 4, mais ce projet va à Swift 3

Répondre

1

Je ne sais pas si cela pourrait vous empêcher:

if let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? UIViewController{ 
    if let _ = toViewController as? Transitionable{ 
     print("conforms to protocol") 
    } 
} 

if let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as? UIViewController{ 
    if let _ = fromViewController as? Transitionable{ 
     print("conforms to protocol") 
    } 
} 

Ou , si vous le souhaitez dans une seule variable à la fois

Vous pouvez créer une nouvelle classe qui étend UIViewController et implémente le protocole Transitionable.

Quelque chose comme:

class YourNewViewControllerClass : UIViewController,Transitionable{ 
    //implements your Transitionable methods 
} 

Après:

if let viewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as? YourNewViewControllerClass{ 
     //success 
} 
+0

j'espérais que je pourrais obtenir et objet qui est à la fois '' UIViewController' et Transitionable' – richy

+0

J'ai modifié ma réponse pour tenter de résoudre votre problème – Sore