快速向下转换和协议变量
我有一个包含一个属性的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() { //... } }