[英]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.