0

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によると 、プロトコル拡張のディスパッチのルールは次のとおりです。

  1. 推定された変数の型がプロトコルの場合:
  2. AND メソッドが元のプロトコルで定義されている場合、拡張にデフォルトの実装があるかどうかに関係なく、ランタイム タイプの実装が呼び出されます。
  3. AND メソッドが元のプロトコルで定義されていない場合、デフォルトの実装が呼び出されます。
  4. ELSE IF 推論された変数の型がその型である THEN 型の実装が呼び出されます。

私が観察している行動は正反対です。私が間違っていることは何ですか?

4

1 に答える 1