繁体   English   中英

快速向下转换和协议变量

[英]Swift downcasting and protocol variables

我有一个包含一个属性的swift协议:

protocol WireframeProtocol: class
{
    var rootViewController: UIViewController  { get }
}

然后我有一个实现此协议的类:

class MenuWireframe : WireframeProtocol
{
    let rootViewController: UIViewController

    init()
    {
        self.rootViewController = MenuViewController(nibName: "MenuViewController", bundle: nil)
        (self.rootViewController as! MenuViewController).presenter = MenuPresenter(interactor: MenuInteractor())
    }
}

在我的Wireframe类中,变量实际上是MenuViewController类型,但必须声明为UIViewController以确认协议。 我必须使用(self.rootViewController as!MenuViewController)将它向下转换为我想要的正确类,以便能够访问其属性。 在我上面的简单例子中它很好但是不是很易读,特别是在更复杂的情况下。 有没有更好的方法来声明协议变量?

非常感谢!

是的,通过使用通用协议,有更好的方法。 要实现它,您必须声明您的协议类似于:

protocol WireframeProtocol{

    typealias RootViewController : UIViewController
    var rootViewController: RootViewController  { get }

}

然后在你的采用类中将rootViewController类型设置为MenuViewController

class MenuWireframe : WireframeProtocol{

let rootViewController: MenuViewController

    init(){
        self.rootViewController = MenuViewController(nibName: "MenuViewController", bundle: nil)
        self.rootViewController.presenter = MenuPresenter(interactor: MenuInteractor())
    }
}

如果您可以更改协议声明,请使用@ zelb的答案。 如果你不能,你可以这样做:

class MenuWireframe : WireframeProtocol 
{
    var rootViewController: UIViewController {
        return menuViewController
    }

    let menuViewController: MenuViewController!

    init()
    {
        menuViewController = MenuViewController(...)
        //...
    }
}

你试过这个吗:

protocol WireframeProtocol: UIViewController {
  var rootViewController: UIViewController  { get }
} 

class MenuWireframe : WireframeProtocol
{
    let rootViewController: WireframeProtocol

    init()
    {
        //...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM