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)
プロトコル プロトコルから reuseID 宣言を削除すると、動作は「修正」されます。これは後退していませんか?https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-futureによると 、プロトコル拡張のディスパッチのルールは次のとおりです。
- 推定された変数の型がプロトコルの場合:
- AND メソッドが元のプロトコルで定義されている場合、拡張にデフォルトの実装があるかどうかに関係なく、ランタイム タイプの実装が呼び出されます。
- AND メソッドが元のプロトコルで定義されていない場合、デフォルトの実装が呼び出されます。
- ELSE IF 推論された変数の型がその型である THEN 型の実装が呼び出されます。
私が観察している行動は正反対です。私が間違っていることは何ですか?