2017-05-06 4 views
1

Disons que nous avons un protocole défini comme:Étendre un protocole avec associatedtype générique

protocol PAT { 
    associatedtype Element 
} 

et j'ai aussi un ENUM (typique Résultat) défini comme:

enum Result<Value> { 
    case success(Value) 
    case error(Error) 
} 

Maintenant, je veux ajouter une extension à PAT lorsque Element est Result<Value> mais le compilateur ne peut pas déterminer Value et déclenche donc une erreur de compilation indiquant "référence à l'argument générique".

est ici le code de l'extension:

extension Pat where Element == Result { 
} 
+0

Bonne question. Je pense qu'il est possible de faire 'où Element == Résultat ' ou quelque chose, mais je ne suis pas sûr qu'il soit possible de le faire pour n'importe quel type de résultat tout en restant générique sur la valeur. Une option serait de rendre le résultat conforme à un autre protocole, alors vous pourriez dire 'where Element: OtherProto'. – jtbandes

+0

@jtbandes Yep 'Résultat ' fonctionne, mais se conformer à un autre protocole ne fonctionne pas non plus. Je veux dire que cela fonctionne dans certains cas, mais cela ne fonctionnera pas si vous utilisez des méthodes ou des variables avec 'Value'. ça va: "La valeur ne peut être utilisée que comme paramètre concret ou générique" – farzadshbfn

+0

Que voulez-vous faire exactement dans l'extension? – jtbandes

Répondre

2

La solution est de créer un autre protocole avec associatedType pour envelopper Résultat dedans.

protocol Resultable { 
    associatedType ValueType 
    var isSuccess: Bool { get } 
    var value: ValueType? { get } 
} 

et faire Résultat étendre Resultable:

extension Result: Resultable { 
    typealias ValueType = Value 
    var isSuccess: Bool { ... } 
    var value: ValueType? { ... } 
} 

et étendre PAT en utilisant Resultable:

extension PAT where Element: Resultable { 
    // in here you have access to Resultable.ValueType 
} 

Remarque

faire de l'écriture que Element: Resultable pas Element == Resultable. C'était la raison pour laquelle mon code ne fonctionnait pas en premier lieu.