Swift协议扩展静态方法调度与超类和子类

时间:2016-06-10 10:16:43

标签: swift protocols dispatch swift-protocols protocol-extension

我在Swift protocol extension method dispatch with superclass and subclass中描述了类似但略有不同的问题。

问题与协议上的静态方法有关。

我有以下代码:

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)

行为是&#34;已修复&#34;如果我从协议协议中删除了reuseID声明。这不是落后的吗?根据{{​​3}},协议扩展的调度规则如下:

  1. 如果推断的变量类型是协议:
  2. 并且该方法在原始协议中定义,然后调用运行时类型的实现,而不管扩展中是否存在默认实现。
  3. AND方法未在原始协议中定义,然后调用默认实现。
  4. ELSE如果变量的推断类型是类型那么调用类型的实现。
  5. 我观察到的行为恰恰相反。知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

如何改变这一点:

extension Protocol {
    static var reuseID: String { return String(self) }
}