Диспетчеризация статических методов расширения протокола 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. Если предполагаемый тип переменной является протоколом:
  2. И метод определен в исходном протоколе, ТО тогда вызывается реализация типа времени выполнения, независимо от того, есть ли реализация в расширении по умолчанию.
  3. И метод не определен в исходном протоколе, ТО вызывается реализация по умолчанию.
  4. В противном случае, если предполагаемый тип переменной является типом, то вызывается реализация типа.

Поведение, которое я наблюдаю, с точностью до наоборот. Есть идеи, что я делаю не так?

1 ответ

Как насчет изменения этого:

extension Protocol {
    static var reuseID: String { return String(self) }
}
Другие вопросы по тегам