Отправка статических методов расширения протокола 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. ИНАЧЕ, ЕСЛИ предполагаемый тип переменной является типом, ТО вызывается реализация типа.

Поведение, которое я наблюдаю, прямо противоположное. Любая идея, что я делаю неправильно?


person duhanebel    schedule 10.06.2016    source источник
comment
По словам Apple, это ошибка в Swift. Я разместил его на сайте swift.org по адресу bugs.swift.org/browse/SR-1786<. /а>   -  person duhanebel    schedule 16.06.2016


Ответы (1)


Как насчет того, чтобы изменить это:

extension Protocol {
    static var reuseID: String { return String(self) }
}
person maquannene    schedule 04.07.2016