Henetworkingar el inicializador de la class genérica

He visto algunas discusiones sobre este problema, pero no he leído una explicación satisfactoria. ¿Alguien puede decirme por qué esto no funciona?

class Parent<T> { var data:T init(data:T) { self.data = data } } class Child : Parent<Int> {} let c = Child(data: 4) 

La última línea da el error:

'Child' cannot be constructed because it has no accessible initializers

¿Realmente necesito implementar el inicializador solo para llamar super ?

Editar:

Para dar un poco de context, el código real se ve más cercano al siguiente. Tengo una class de Action que utiliza generics porque tengo otro código que puede encadenar acciones y quiero utilizar la security del tipo de Swift para garantizar que las acciones se puedan encadenar. Entonces tengo un montón de classs de subclasss (por ejemplo, CustomAction ). Estoy buscando una manera de evitar anular el método init en cada una de las subclasss. O, como alternativa, quiero entender por qué eso no es posible.

 class Action<Input, Output> { var cachedOutput:Output? init(cachedOutput:Output?) { self.cachedOutput = cachedOutput } } protocol CustomInput {} protocol CustomOutput {} class CustomAction : Action<CustomInput, CustomOutput> { } 

Sí, realmente necesitas replace el método init.

 class Parent<T> { var data:T init(data:T) { self.data = data } } class Child<T> : Parent<T> { override init(data: T) { super.init(data: data) } } let c = Child(data: 4) // Child<Int> let c2 = Child(data: "alfa") // Child<String> 

cuales son los errores …

 // what is the type T ? it is undeclanetworking! class Child2: Parent2<T> {} // how to specialize non-generic type Parent ? how to create it? // i need an initializer in class Child3 ... Hm ... class Child3: Parent<Int> {} // cannot specialize non-generic type 'Parent' class Child3: Parent<Int> { override init(data: Int) { super.init(data: data) } } // So, Child3 must be of the same specialized type as Parent!! 

eso es terrible, ¿no es así? ¡Mira mi último ejemplo!

 class Parent<T> { var data:T init(data:T) { self.data = data } } class Child<Double> : Parent<String> { init(data: Double) { super.init(data: "\(data)") } } let c = Child(data: 4) // Child<Int> !!!!! let d = Child(data: true) // Child<Bool> !!! 

en tu caso funciona como

 class Parent<T> { var data:T init(data:T) { self.data = data } } class Child: Parent<String> { init(data: Double) { super.init(data: "\(data)") } } let c = Child(data: 4) print(c.dynamicType) // Child :-) 

Esto ahora funciona en Swift 3. Ahora comstack mi ejemplo original. No se menciona esto en los cambios del lenguaje Swift 3 , así que solo puedo suponer que se trata de un error.