2015-11-15 69 views
0

我有一個函數,參數vcType:UIViewController.Type,我試圖讓檢查動態類型檢查混亂斯威夫特

if getTopmostViewController() is vcType { 
    // do stuff 
} 

但我是一個錯誤「vcType不是一個類型」 。我不確定問題是什麼,或者是否有更好的方法來做到這一點。

+1

這聽起來像你的'vcType'參數不是一個真正的類型。這是一個對象。你想檢查最頂層的視圖控制器是否與'vcType'對象具有相同的類?或者你真的想讓你的函數採用一個類型參數? –

回答

2

也許你想是這樣的:

if getTopmostViewController().isKindOfClass(vcType.dynamicType) { 
    // do stuff 
} 

以上,vcType是一些類的實例,它的檢查getTopmostViewController()是否返回同一個類(或子類)的一個實例。

或者,也許你真的想寫這樣的功能:

func doStuffIfTopMostViewControllerHasType<VCType: UIViewController>(_: VCType.Type) { 
    if getTopmostViewController() is VCType { 
     // do stuff 
    } 
} 

你然後調用這樣的:

doStuffIfTopMostViewControllerHasType(MyViewController.self) 

請注意,我傳遞MyViewController類本身,MyViewController的實例。

+0

AFAIU,在OP的情況下,它只會檢查'如果getTopmostViewController()。isKindOfClass(vcType){...}'因爲vcType已經是元類型。 – courteouselk

+1

除我之外,還有人認爲奇怪的是獲得'isKindOfClass'功能的唯一方法是通過Foundation嗎? Swift在本地生成這樣的想法並不合理。 – matt

3

嘗試更換:

getTopmostViewController() is vcType 

有了:

getTopmostViewController().dynamicType == vcType 

編輯: 這隻會工作檢查的確切類型。如果由getTopmostViewController()返回的控制器是vcType的後代,則將返回false

+1

是的,如果僅僅需要檢查最頂層的VC是不是''vcType'',那麼它就可以工作。然而,如果有必要檢查最頂層的VC是否是'vcType'或其後代之一,那麼這是行不通的。 – courteouselk

+0

確定無誤,編輯回覆。 – Eppilo