一尘不染

来自超类函数中相应子类的Swift调用类函数

swift

我想init(coder aDecoder: NSCoder!)在超类中实现,并通过在运行时在超类中的特定子类上调用类方法在所有子类中使用它。

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)")
    }

}

子类是否有可能在运行时MySuperClass访问类函数dummyDict()


阅读 284

收藏
2020-07-07

共1个答案

一尘不染

我想我明白了你的意思。您创建一个Base类,实现一个初始化程序和一个类(静态)函数:

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)")
        }
    }
}

接下来,您要创建子类,并让初始化程序调用该dummyDict方法的重写版本。您只需要重写该方法即可:

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

现在,当您创建的实例时Subclass1,显示的内容是:

encoding sub1 for key subclass1

这是预期的输出。

请注意,for初始化程序中的循环正在使用self.dynamicType.dummyDict()而不是Base.dummyDict()。后者总是调用在类中定义的类方法Base,而前者则在从继承的实际类的范围内调用它Base

2020-07-07