2015-10-14 1 views
0

Je donne les résultats suivants:ne peut invoquer la méthode de protocole sur le type générique restreint par un autre protocole

protocol Guard { 

    var prisoners: Array<Prisoner>? { get set } 

    func smack<T: Prisoner>(prisoner: T) 

    func smackAll() 


} 

extension Guard { 

    final func smackAll() { 

     prisoners?.forEach() { smack($0) } 

     //ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'" 

    } 

} 

protocol Prisoner { 

    var guards: Array<Guard>? { get set } 

} 

extension Prisoner { 

    final func incurBeating() { 

     guards?.forEach() { $0.smack(self) } 

    } 

} 

Je souhaite attribuer le protocole Guard à un certain nombre d'objets de différents types de classes et Prisoner à d'autres objets . Les objets agissant en tant que gardes auront leurs propres implémentations en fonction de leur type de classe. Mais je ne vois aucune raison de réécrire smackAll dans chaque classe qui pourrait hériter Guard. Donc j'essaye de faire comme ça, mais le compilateur ne me laisse pas. Qu'est-ce que je rate?

Répondre

0

Ce qui suit semble fonctionner pour moi.

protocol Guard { 
    var prisoners: Array<Prisoner>? { get set } 
    func smack<Prisoner>(prisoner: Prisoner) 
    func smackAll() 
} 

extension Guard { 
    func smackAll() { 
     prisoners?.forEach() { smack($0) } 
     //ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'" 
    } 
} 

protocol Prisoner { 
    var guards: Array<Guard>? { get set } 
} 

Remarque: func smack (prisonnier: Prisonnier) vous n'avez pas besoin d'utiliser T: Prisonnier. C'est déjà une interface et peut être référé à l'interface, il ne vous laissera rien y mettre qui ne soit pas un implémenteur de Prisonnier de toute façon. Le seul cas que vous utiliseriez est d'ajouter plus de contrainte à une classe concrète comme T: Où MyConcrete implémente Prisonnier

+0

Merci beaucoup pour votre aide. Je pense que j'essayais d'utiliser les génériques dans le mauvais sens pour ce que je voulais faire (je les ai seulement découvert aujourd'hui quand j'avais un usage pour eux). – user2320861