快速向下转换和协议变量

我有一个包含一个属性的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() { //... } }