Я только что столкнулся со странным поведением в обработке наследования 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()
напечатанныйвывод
тип (из: self) = TestClass
T.Type = TestSuperClass
тип (из: self) = TestClass2
T.Type = TestClass2
Так что в основном при вызове testClass.run()
, type(of: self)
выдает TestClass
, что я и ожидал.Проблема в том, что обобщенная функция testGeneric
, которая вызывается сразу после этого, почему-то не работает с типом TestClass
, но вместо этого использует TestSuperClass
.
Что я лично ожидаю, так это
тип (из: self) = TestClass
T.Type = TestClass
тип (из: self) = TestClass2
T.Type = TestClass2
т.е. универсальная функция testGeneric
, использующая тип TestClass
вместо TestSuperClass
при вызове через testClass.run()
.
Вопросы:
- У вас есть объяснениечто?
- Как я могу получить поведение, которое я имел в виду?