【问题标题】:Check if an object is a specific class and conforms to a protocol检查对象是否是特定类并符合协议
【发布时间】:2017-08-02 16:39:18
【问题描述】:

不确定这是否是一种奇怪的方法,但在 Swift 3 中,我想检查一个对象是否为 UIViewController 并符合我的协议 Transitionable。我有:

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
}

但我希望我能得到和反对既是UIViewController 又是Transitionable 的往返。 我试过let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? Transitionable as? UIViewController,但这只是一个UIViewController

我也试过了:

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

但我得到错误:'Transitionable' is not a subtype of 'UIViewController' 当我打电话给toTransitionable.viewController 例如

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

我知道我们可以在 Swift 4 中使用 as? (UIViewController & Transitionable),但这个项目将在 Swift 3 中进行

【问题讨论】:

    标签: swift swift3 protocols mixins


    【解决方案1】:

    我不确定这是否有帮助,但请尝试:

    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")
        }
    }
    

    或者,如果您只希望在一个变量中同时使用两者

    您可以创建一个扩展 UIViewController 的新类并实现协议 Transitionable。

    类似:

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

    之后:

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

    【讨论】:

    • 我希望我能得到 UIViewControllerTransitionable 的反对意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多