当涉及到多态性和动态类型时,我刚刚在 swift 的继承处理中遇到了一个奇怪的行为。下面的代码显示了我遇到的问题,基本上是:动态类型被正确识别(由 打印print("type(of: self) = \(classType)")),但是泛型函数testGeneric使用了错误的类型。
class Global {
static func testGeneric<T: TestSuperClass>(of type: T.Type) {
print("T.Type = \(T.self)")
}
}
class TestSuperClass {
func run() {
let classType = type(of: self)
print("type(of: self) = \(classType)")
Global.testGeneric(of: classType)
}
}
class TestClass: TestSuperClass {
}
class TestClass2: TestSuperClass {
override func run() {
let classType = type(of: self)
print("type(of: self) = \(classType)")
Global.testGeneric(of: classType)
}
}
let testClass = TestClass()
let testClass2 = TestClass2()
testClass.run()
testClass2.run()
打印输出是
type(of: self) = TestClass
T.Type = TestSuperClass
type(of: self) = TestClass2
T.Type = TestClass2
所以基本上在调用testClass.run()时会type(of: self)产生TestClass,这是我所期望的。那么问题是随后立即调用的泛型函数testGeneric不知何故不适用于 type TestClass,而是使用TestSuperClass。
我个人期望的是
type(of: self) = TestClass
T.Type = TestClass
type(of: self) = TestClass2
T.Type = TestClass2
即,testGeneric使用类型TestClass而不是TestSuperClass调用时的泛型函数 via testClass.run()。
问题:
- 你对此有解释吗?
- 我怎样才能得到我想到的行为?