2016-07-06 23 views
5

Ho una classe come SomeController<A where A: ProtA>Tipo controllo di una classe con i tipi generici

Ho alcune sottoclassi come SubController: SomeController<SubA>

Ecco un esempio di lavoro di come sto cercando di tipo controllare:

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" 

Dal punto di vista funzionale, il codice fa esattamente quello che voglio, tuttavia, mi viene lasciato un sacco di avvertenze che dicono Cast from SuperClass<A> to SubClass always fails

Chiaramente i tipi sono correlati, e chiaramente il codice funziona bene e non 'fallisce sempre', quindi questo avvertimento sembra essere sbagliato. Si tratta di una limitazione corrente o di un caso limite del sistema dei tipi, oppure esiste un modo per far sparire l'avviso?

+0

Quando si dà esempi di codice, aiuta il contesto completo, così possiamo più facilmente testare e giocare con lui – Alexander

+0

@AMomchilov vuoi dire come con un parco giochi? Posso fornire un esempio che compila in un parco giochi e mostra l'avviso. –

+0

@ trevor-e Sarebbe fantastico. –

risposta

0

Definizione di SuperClass in quanto il proprio generico sopprime l'avviso. Inoltre, non penso che sia necessaria una clausola where per specificare che A è conforme 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

Scusa se non ho altre informazioni, ma ho pensato che questo potrebbe aiutare! – bradkratky

+0

Questo "funziona", ma sembra un po 'hacky dal momento che è necessario utilizzare A nell'elenco dei parametri in modo che non si lamenta del tipo generico inutilizzato. –

+0

Sono d'accordo, ma ho pensato che potrebbe essere utile per trovare in qualche modo un'altra soluzione. Non sono sicuro quali siano le tue esigenze ma potresti anche modificare SomeProtocol in una classe (dato che devi specificarlo come tipo concreto): 'func classTest > (classToTest: B)' – bradkratky