the*_*tic 8 nscoding ios swift
我想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)")
}
}
Run Code Online (Sandbox Code Playgroud)
子类是否有可能在运行时MySuperClass访问类函数dummyDict()?
Ant*_*nio 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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,您要创建子类,并使用初始化程序来调用方法的重写版本dummyDict.您只需覆盖该方法:
class Subclass1 : Base {
override class func dummyDict() -> Dictionary<String, String> {
return ["subclass1": "sub1"]
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当您创建一个实例时Subclass1,打印的是:
encoding sub1 for key subclass1
Run Code Online (Sandbox Code Playgroud)
这是预期的产出.
注意for初始化器中的循环是使用self.dynamicType.dummyDict()而不是Base.dummyDict().后者总是调用类中定义的类方法Base,而前者在继承自的实际类的范围内调用它Base
在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"]
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10263 次 |
| 最近记录: |