0

我有一个类似但略有不同的问题:Swift protocol extension method dispatch with superclass and subclassSwift协议扩展带有超类和子类的静态方法调度

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

我有以下代码:

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声明。这不是落后吗?根据https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future用于调度对协议扩展的规则如下:

  1. IF推断出的类型的变量的是协议:
  2. 并且该方法在原始协议THEN运行时类型的实现被称为定义,而不管在扩展中是否有默认实现。
  3. 并且该方法未在原始协议中定义,则调用默认实现。
  4. 否则如果变量的推断类型是THEN类型的实现被调用。

我正在观察的行为恰恰相反。任何想法我做错了什么?

+0

据苹果公司称,它似乎是在斯威夫特的错误。我通过https://bugs.swift.org/browse/SR-1786在swift.org上提交了它 – duhanebel

回答

0

如何改变这样的:

extension Protocol { 
    static var reuseID: String { return String(self) } 
} 
相关问题