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