0

Je vais avoir un problème similaire mais légèrement différent décrit dans: Swift protocol extension method dispatch with superclass and subclass.Swift extension de protocole méthodes statiques avec superclasse et expédient la sous-classe

Le problème est lié aux méthodes statiques sur les protocoles.

J'ai le code suivant:

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) 

Le comportement est « fixe » si je retire la déclaration de reuseID du Protocole de protocole. N'est-ce pas arriéré? Selon https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future les règles pour l'envoi des extensions de protocole sont les suivantes:

  1. Si le type inférées d'une variable est le protocole:
  2. et la méthode est définie dans le protocole d'origine, alors la mise en œuvre du type d'exécution est appelé , qu'il existe ou non une implémentation par défaut dans l'extension.
  3. ET la méthode n'est pas définie dans le protocole d'origine, ALORS l'implémentation par défaut est appelée.
  4. SINON SI le type inféré de la variable est le type alors la mise en œuvre du type est appelé.

Le comportement j'observe est exactement le contraire. Une idée de ce que je fais mal?

+0

Selon Apple, il semble y avoir un bug dans Swift. Je l'ai déposé sur swift.org à https://bugs.swift.org/browse/SR-1786 – duhanebel

Répondre

0

Que diriez-vous à ce changement:

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