2016-07-06 348 views
5

我有一類像SomeController<A where A: ProtA>類型檢查與泛型類

我有一些子類像SubController: SomeController<SubA>

這裏是我怎麼想鍵入檢查工作示例:

protocol SomeProtocol { 

} 

class SuperClass<A where A: SomeProtocol> { 

} 

class SubProtocol: SomeProtocol { 

} 

class SubClass: SuperClass<SubProtocol> { 

} 

func classTest<A where A: SomeProtocol>(classToTest: SuperClass<A>) { 
    switch classToTest { 
    case is SubClass: // Has warning 'Cast from SuperClass<A> to SubClass always fails' 
     print("I'm a SubClass") 

    default: 
     print("Wasn't found") 
    } 
} 

classTest(SubClass()) // Prints "I'm a SubClass" 

從功能上來說,代碼確實是我想要的,但是,我留下了大量的警告說Cast from SuperClass<A> to SubClass always fails

顯然類型是相關的,顯然代碼運行良好,並不總是失敗,所以這個警告似乎是錯誤的。這是類型系統的當前限制還是邊緣情況,還是有辦法使警告消失?

+0

當你給的代碼示例,它有助於完整的上下文,所以我們可以更容易地測試它並使用它 – Alexander

+0

@AMomchilov你的意思是像一個遊樂場?我可以提供一個在Playground中編譯並顯示警告的示例。 –

+0

@ trevor-e那太棒了。 –

回答

0

定義SuperClass,因爲它自己的通用禁止警告。我也不認爲你需要一個where子句來指定A符合SomeProtocol。

func classTest<A:SomeProtocol, B:SuperClass<A>>(classToTest: B, useA:A) { 

    switch classToTest { 
    case is SubClass: // Has warning 'Cast from SuperClass<A> to SubClass always fails' 
     print("I'm a SubClass") 

    default: 
     print("Wasn't found") 
    } 
} 
+0

對不起,我沒有更多的信息,但我認爲這可能會有所幫助! – bradkratky

+0

這個「有效」,但是因爲你需要在參數列表中使用A,所以它不會抱怨泛型類型未被使用。 –

+0

我同意,但我認爲這可能有助於以某種方式找到另一種解決方案。我不確定你的需求是什麼,但你也可以將SomeProtocol改爲一個類(因爲你需要將它指定爲具體類型):'func classTest >(classToTest:B)' – bradkratky