簡體   English   中英

快速向下轉換和協議變量

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM