2017-06-26 4 views
0

J'apprends toujours à travailler avec des tableaux d'objets implémentant des protocoles avec des types associés.Protocoles Swift et équitables

je les protocoles suivants:

public protocol Word : Equatable, Hashable { // compiles 

    associatedtype WordType : Equatable 

    var moreWords: [WordType] { get } 

} 

public protocol WordDataSource { // compiles 

    associatedtype SomeWord : Word 

    func findWord(spelling: String) -> SomeWord? 

} 

Je WordA, WordB et WordC tout mettre en œuvre Word et subclassing NSObject

Fondamentalement, je veux mettre en œuvre le protocole de source de données en utilisant différents types de classe mise en œuvre du Classe de mots C'est le genre de code que je voudrais écrire, mais évidemment il ne compile pas.

class MyDataSource : WordDataSource { 

    func findWord(spelling: String) -> SomeWord? { 

     if conditionA { 
      return WordA() 
     } 
     if conditionB { 
      return WordB() 
     } 
     if conditionA { 
      return WordC() 
     } 
    } 

} 

Est-ce encore possible dans Swift? Que dois-je écrire pour que cela fonctionne?

Merci beaucoup pour votre aide!

Répondre

0

Ce n'est pas possible, et ce n'est pas possible pour une raison. Supposons que votre classe MyDataSource compile. Maintenant, nous pourrions écrire ce code:

let fooWord = MyDataSource().findWord(spelling: "Foo") // Would return WordA instance 
let barWord = MyDataSource().findWord(spelling: "Bar") // Would return WordB instance 

mais tout ce que nous savons au sujet de ces deux types est qu'ils sont de ce type SomeWord. Donc, ils devraient être comparables, puisque Word est comparable, non?

Mais ce sont deux types complètement différents, alors comment sauriez-vous comment les comparer? Jetez un oeil à la définition du protocole Equatable:

public static func ==(lhs: Self, rhs: Self) -> Bool

Vous ne pouvez comparer deux objets du même type qui sont conformes à ce protocole.