Диспетчеризация статических методов расширения протокола Swift с использованием суперкласса и подкласса
У меня похожая, но немного другая проблема, описанная в: Диспетчеризация метода расширения протокола Swift с суперклассом и подклассом.
Проблема связана со статическими методами на протоколах.
У меня есть следующий код:
protocol Protocol: class {
static var reuseID: String { get }
}
extension Protocol {
static var reuseID: String { return String(Self) }
}
class MyClass {
func registerClass<T where T: Protocol>(cell: T.Type) {
print(cell) // <-- Prints "SubClass"
print(cell.self) // <-- Prints "SubClass"
print(cell.reuseID) // <-- Prints "SuperClass", expected "SubClass"
}
}
class SuperClass: Protocol {}
class SubClass: SuperClass {}
print(SubClass.self) // <-- Prints "SubClass"
print(SubClass.reuseID) // <-- Prints "SubClass"
MyClass().registerClass(SubClass.self)
Поведение "исправлено", если я удаляю объявление reuseID из протокола Protocol. Разве это не назад? Согласно https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future правила отправки расширений протокола следующие:
- Если предполагаемый тип переменной является протоколом:
- И метод определен в исходном протоколе, ТО тогда вызывается реализация типа времени выполнения, независимо от того, есть ли реализация в расширении по умолчанию.
- И метод не определен в исходном протоколе, ТО вызывается реализация по умолчанию.
- В противном случае, если предполагаемый тип переменной является типом, то вызывается реализация типа.
Поведение, которое я наблюдаю, с точностью до наоборот. Есть идеи, что я делаю не так?
1 ответ
Как насчет изменения этого:
extension Protocol {
static var reuseID: String { return String(self) }
}