Swift调用类函数来自超类函数中的相应子类 [英] Swift call class function from corresponding subclass in superclass function

查看:303
本文介绍了Swift调用类函数来自超类函数中的相应子类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to implement init(coder aDecoder: NSCoder!) in a superclass, and use it in all subclasses by calling a class method on the particular subclass in the superclass at runtime.

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 ()在运行时?

Is it possible that subclasses from MySuperClass access the class function dummyDict() at runtime ?

推荐答案

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

I think I caught what you mean. You create a Base class, implementing an initializer and a class (static) function:

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 方法的重写版本。您只需要覆盖该方法:

Next you want to create subclasses, and have the initializer to call an overridden version of the dummyDict method. You simply have to override that method:

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

现在,当您创建 Subclass1 的实例时,打印的是:

Now, when you create an instance of Subclass1, what's printed is:

encoding sub1 for key subclass1

这是预期的输出。

注意初始化程序中的 for 循环使用 self.dynamicType.dummyDict()而不是 Base.dummyDict()。后者总是调用 Base 类中定义的类方法,而前者在继承自 Base

Note the for loop in the initializer is using self.dynamicType.dummyDict() rather than Base.dummyDict(). The latter always calls the class method defined in the Base class, whereas the former calls it in the scope of the actual class inherited from Base

这篇关于Swift调用类函数来自超类函数中的相应子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆