2017-06-12 5 views
0

J'ai réalisé un projet fictif pour tester les génériques et les types associés.Problème avec les génériques, les types associés et les équivalents

est ici un protocole

protocol WordProto : Equatable { // BTW not sure if I should put Equatable here 

    associatedtype WordAlias : Equatable // or here 

    var homonyms: [WordAlias] { get } 

} 

Et voici une classe

class SomeFrameworkClass<T : WordProto> { 

    typealias SomeWord = T 

    func testClass(word: SomeWord) { 

     if word.homonyms.contains(word) { 

     } 

    } 

} 

Donc cela ne compile pas sur la contains et voici l'erreur: ne peut invoquer contient une liste d'arguments de type T

Vous ne savez pas comment résoudre ce problème, merci pour votre aide!

Répondre

1

T et WordAlias ​​peuvent être de types différents. Cela devrait être spécifié.

à mon humble avis cela devrait fonctionner:

protocol WordProto { 

    associatedtype WordAlias: Equatable 

    var homonyms: [WordAlias] { get } 

} 

class SomeFrameworkClass<T: WordProto> where T.WordAlias == T { 

    func testClass(word: T) { 

     if word.homonyms.contains(word) { 

     } 
    } 
} 

OU avec autoréférence:

protocol WordProto: Equatable { 

    var homonyms: [Self] { get } 

} 

class SomeFrameworkClass<T: WordProto> { 

    func testClass(word: T) { 

     if word.homonyms.contains(word) { 

     } 
    } 
} 
+0

Oui, il le fait! Merci beaucoup! – lorenzo