2017-05-22 7 views
1

dieses Protokolls:Swift 3: Kann nicht (Protokoll-Methode) mit Argumentliste vom Typ (generic) aufrufen

import Foundation 

protocol Updatable { 
    associatedtype E 

    func updateValuesWith(_ newElement: E) 
} 

Und diese Implementierung:

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)!) 
    } 
} 

ich nicht, warum ich bin immer diese Fehlermeldung

nicht aufrufen kann 'updateValuesWith' mit einem Argument Liste vom Typ '(T)'

ein Argument Liste vom Typ '(T.E)'

auf Linie erwartet.

Nach einigen unfruchtbaren Recherchen bin ich überzeugt, dass ich etwas sehr grundlegendes vermissen muss, aber immer noch nicht genau herausfinden kann was.

Erleuchte mich bitte?

Antwort

1

Sie sind Eingabeparameter Typ deklarieren TUpdatable zu sein, aber Ihr updateValuesWith nicht T nicht nehmen. Es nimmt einen anderen Typ E, den Sie überhaupt nicht angeben. Wenn Sie Ihren Code wollen wie es ist zu kompilieren, müssen Sie den Compiler sagen, was E sein soll:

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

, die irgendwie seltsam ist, weil ich keine Ahnung, wie updateValuesWith weiß, was zu tun ist, wenn newElement tut implementieren Sie keine nützliche Schnittstelle (außer zwingen Sie es, es zu dem zu bringen, was Sie erwarten). Aber das wäre eine andere Frage ...

+0

Ok ich verstehe jetzt, danke Mann. "Updatable" ist ein Protokoll, dem einige Klassen in meinem Modell entsprechen. Sie haben jeweils ihre eigene Implementierung der Protokollmethode, so dass sie alle eine "nützliche Schnittstelle" implementieren. Klingt das richtig oder gibt es eine Best Practice, die Sie teilen könnten? – Herakleis

Verwandte Themen