我想在超类中实现init(coder aDecoder: NSCoder!)
,并通过在运行时调用超类中特定子类的类方法在所有子类中使用它。
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()
?
答案 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)
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"
}
}