Swift Generics no instanciará generics cuando use inheritance

Tengo classs Alpha y Berry :

 class Alpha { } class Berry : Alpha { } 

Tengo una function que usa inheritance dentro de su genérico:

 func myFunc<T : Alpha>(v:T) -> T { return T() } 

Llamo a myFunc así:

 myFunc(Berry()) 

En mi proyecto, el object que se devuelve es del tipo Alpha y no del tipo Berry . ¿Esto es un error en el comstackdor, o si esto es simplemente algo que no entiendo sobre los generics?

Lo que intentas lograr es pasar una instancia de Berry y get otra instancia de Berry .

Si es así, el siguiente código debería funcionar:

 class Alpha { requinetworking init() { } // ← YOU NEED THIS func printme() { println("I'm alpha") } } class Berry : Alpha { override func printme() { println("I'm berry") } } func myFunc<T:Alpha>(v:T) -> T { return v.dynamicType() } // This also works: /* func myFunc<T: Alpha>(v:T) -> T { return (T.self as T.Type)() } */ let a = myFunc(Berry()) a.printme() // -> I'm berry 

requinetworking init() { } es necesario para garantizar que todas las classs derivadas de Alpha tengan init() initializer. Aquí está relacionado Q / A: los generics Swift no preservan el tipo

Si lo que quieres es pasar a Berry como tipo y get una nueva instancia de Berry , testing esto:

 class Alpha { requinetworking init() { } func printme() { println("alpha") } } class Berry : Alpha { override func printme() { println("berry") } } func myFunc<T:Alpha>(v:T.Type) -> T { return v() } let a = myFunc(Berry) a.printme()