Función de class de llamada Swift desde la subclass correspondiente en la function de superclass

Me gustaría implementar init(coder aDecoder: NSCoder!) En una superclass y usarlo en todas las subclasss llamando a un método de class en la subclass particular de la superclass en time de ejecución.

MySuperClass

 class func dummyDict() -> NSDictionary init(coder aDecoder: NSCoder!) { for(key,value) in self.class.dummyDict(){ -------------------- ^ | | Get this from the corresponding subclass at runtime! NSLog("encoding \(value) for key \(key)") } } 

¿Es posible que las subclasss de MySuperClass accedan a la function de class dummyDict() en time de ejecución?

Creo que entendí lo que quieres decir. Crea una class Base , implementando un inicializador y una function de class (estática):

 class Base { class func dummyDict() -> Dictionary<String, String> { return ["base1": "val1"] } init() { for (key, value) in self.dynamicType.dummyDict() { println("encoding \(value) for key \(key)") } } } 

A continuación, desea crear subclasss y tener el inicializador para invocar una versión sobrescrita del método dummyDict . Simplemente tiene que anular ese método:

 class Subclass1 : Base { override class func dummyDict() -> Dictionary<String, String> { return ["subclass1": "sub1"] } } 

Ahora, cuando crea una instancia de Subclass1 , lo que se imprime es:

 encoding sub1 for key subclass1 

que es el resultado esperado.

Tenga en count que el bucle for en el inicializador está utilizando self.dynamicType.dummyDict() lugar de Base.dummyDict() . Este último siempre llama al método de class definido en la class Base , mientras que el primero lo llama en el scope de la class real henetworkingado de la Base

dynamicType está en desuso en Swift 3. Debemos usar type(of:) .

Entonces, el ejemplo de Antonio es ahora:

 class Base { class func dummyDict() -> [String: String] { return ["base1": "val1"] } init() { for (key, value) in type(of: self).dummyDict() { print("encoding \(value) for key \(key)") } } } class Subclass1 : Base { override class func dummyDict() -> [String: String] { return ["subclass1": "sub1"] } } 

[ELIMINADO]

use dynamicType como Antonio sugirió en su respuesta

 class Test : NSObject { class func dummy() -> String { return "t" } init() { super.init() println("\(self.dynamicType.dummy())") } } class Test1 : Test { override class func dummy() -> String { return "t1" } } class Test2 : Test { override class func dummy() -> String { return "t2" } }