我有一个包含一个属性的swift协议:
(-5,-5)
然后我有一个实现此协议的类:
protocol WireframeProtocol: class
{
var rootViewController: UIViewController { get }
}
在我的Wireframe类中,变量实际上是MenuViewController类型,但必须声明为UIViewController以确认协议。我必须使用(self.rootViewController as!MenuViewController)将它向下转换为我想要的正确类,以便能够访问其属性。在我上面的简单例子中它很好但是不是很易读,特别是在更复杂的情况下。有没有更好的方法来声明协议变量?
非常感谢!
答案 0 :(得分:4)
是的,通过使用通用协议,有更好的方法。要实现这一点,您必须声明您的协议类似于:
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())
}
}
答案 1 :(得分:2)
如果您可以更改协议声明,请使用@ zelb的答案。如果你做不到,你可以做类似的事情:
class MenuWireframe : WireframeProtocol
{
var rootViewController: UIViewController {
return menuViewController
}
let menuViewController: MenuViewController!
init()
{
menuViewController = MenuViewController(...)
//...
}
}
答案 2 :(得分:1)
你试过这个吗?
protocol WireframeProtocol: UIViewController {
var rootViewController: UIViewController { get }
}
class MenuWireframe : WireframeProtocol
{
let rootViewController: WireframeProtocol
init()
{
//...
}
}