2017-05-22 6 views
1

Donné ce protocole (méthode de protocole):Swift 3: ne peut pas invoquer avec la liste des arguments de type (générique)

import Foundation 

protocol Updatable { 
    associatedtype E 

    func updateValuesWith(_ newElement: E) 
} 

Et cette mise en œuvre:

private func update<T: NSObject>(_ values: inout [T], with newValues: [T]) where T: Updatable { 

    guard values.count != 0 else { values = newValues; return } 

    for newElement in newValues { 

     let newIndex = newValues.index(of: newElement) 

     if values.contains(newElement) { 

      let oldIndex = values.index(of: newElement) 

      values[oldIndex!].updateValuesWith(newElement) //<--- PROBLEM HERE 

      if oldIndex != newIndex { 

       swap(&values[oldIndex!], &values[newIndex!]) 
      } 
     } else { 

      values.insert(newElement, at: newIndex!) 
     } 
    } 

    for element in values where values.index(of: element)! > newValues.count { 

     values.remove(at: values.index(of: element)!) 
    } 
} 

Je ne comprends pas pourquoi je suis obtenir ce message d'erreur

ne peut être invoqué 'updateValuesWith' avec une liste de type d'argument '(T)'

liste attendait à une argument de type '(de T.E)'

en ligne . Après quelques recherches infructueuses, je suis convaincu que je dois manquer quelque chose de très basique mais je n'arrive toujours pas à savoir exactement quoi.

Eclairez-moi s'il vous plaît?

Répondre

1

Vous déclarez le type de paramètre d'entrée T comme étant Updatable, mais votre updateValuesWith ne prend pas T. Il faut un autre type E que vous ne spécifiez pas du tout. Si vous voulez que votre code pour compiler tel quel, vous devez dire au compilateur ce qui est E censé être:

... where T: Updatable, T.E == T

qui est un peu étrange parce que je ne sais pas comment updateValuesWith sait quoi faire, quand newElement-t ne pas implémenter d'interface utile (sauf forcer la coulée à ce que vous attendez d'elle). Mais ce serait une question différente ...

+0

Ok, je comprends maintenant, merci l'homme. 'Updatable' est un protocole dans lequel quelques classes de mon modèle se conforment, elles ont chacune leur propre implémentation de la méthode de protocole afin qu'elles implémentent toutes une" interface utile ". Cela vous semble-t-il correct ou y a-t-il une meilleure pratique à partager? – Herakleis