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

时间:2014-07-12 09:20:53

标签: ios swift nscoding

我想在超类中实现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()

3 个答案:

答案 0 :(得分:15)

我想我明白了你的意思。您创建了一个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

的实际类的范围内调用它

答案 1 :(得分:5)

在Swift 3中不推荐使用

dynamicType。我们必须使用type(of:)

所以安东尼奥的例子现在是:

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

答案 2 :(得分:-2)

[DELETED]

使用 dynamicType ,正如安东尼奥在答案中建议的那样

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