快速向下转换和协议变量

时间:2015-05-19 11:42:32

标签: ios iphone swift

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

(-5,-5)

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

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

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

非常感谢!

3 个答案:

答案 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()
    {
        //...
    }
}