What you trying to achieve is passing an instance of Berry and getting another instance of Berry?
If so, following code should work:
class Alpha {
required 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
required init() { } is necessary to ensure all classes derived from Alpha have init() initializer.
Here is related Q/A: Swift generics not preserving type
If what you want is passing Berry as a type and get new instance of Berry, try this:
class Alpha {
required 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()