Ich möchte den Aufruf einer "setup" -Methode in UITableViewCell-Unterklassen vereinfachen. Nicht alle Setup-Methoden sind jedoch identisch, aber ihre Parameter erben vom gleichen Typ. Ist es möglich mit Generics oder Protokoll, den Parameter nicht jedes Mal zu werfen?
Zuerst mache ich eine cellForRow-Methode wie folgt:
%Vor%wo ich die Zelle mit cellData und viewModel eingerichtet habe.
In meinen (vielen) benutzerdefinierten UITableViewCell-Unterklassen:
%Vor% wobei HomeViewTableViewCellData
Unterklasse von TableViewCellData
und ist
HomeViewModel
ist eine Unterklasse von ViewModel
Stattdessen möchte ich die Wachen entfernen und direkt etwas schreiben:
%Vor%Versuchte Lösungen (die nicht funktionieren):
Allerdings kann ich assoziierte Typen / Typalias nicht für das Protokoll verwenden, da dies zu einem Fehler beim Umwandeln in die cellForRow-Methode führt. "Protocol ... kann nur als generische Einschränkung verwendet werden, da sie Self- oder zugehörige Typanforderungen hat" . Ich habe diese Methode ausprobiert: " Unbekannte Klasse in der Interface-Builder-Datei "wenn eine Klasse verwendet wird, die von einer generischen Klasse in einem Storyboard erbt
Ich kann auch keine generische Basisklasse verwenden, da der Builder für Schnittstellen dann abstürzt: Wie generiere ich generische Protokolle in Swift? (siehe auch Edit 2 unten)
Irgendwelche Ideen oder muss ich mit meinen Castings leben?
Bearbeiten 1: Nach den Vorschlägen von Nate Mann habe ich diesen Code ausprobiert (ich habe einige generische Typen umbenannt):
%Vor%Diese Zeile funktioniert auch: (Beachten Sie die zusätzliche where-Klausel)
%Vor%Aber Wechsel von
%Vor%bis
%Vor%Geben Sie diesen Fehler ein:
%Vor%Edit 2: Die Verwendung einer konkreten Version einer generischen Basisklasse für eine UITableViewCell-Klasse ist ebenfalls nicht möglich. Siehe Warum kann der Interface Builder nicht verwendet werden? eine konkrete generische Unterklasse von UIView?
Meine eigene Vorstellung von der Antwort ist, dass es im Moment nicht möglich ist.
Nate Manns Antwort verlangt von mir, eine konkrete Implementierung von CellDataSetupable
anzugeben, die ich nicht möchte.
timaktimaks Antworten benötigen entweder eine konkrete Implementierung oder erfordern eine Unterklasse einer UIView.
Wenn Sie DataSource
verwenden, geben Sie konkrete Typen an, mit denen DataSource
arbeitet. Also,
sollte wirklich
sein %Vor% wobei HomeTableViewCell
eine konkrete UITableViewCell
Unterklasse ist, die mit CellDataSetupable
übereinstimmt (wie BlurbTableViewCell
oder TransactionTableViewCell
). Es wird dann gut funktionieren.
Hier ist ein einfaches generisches TableViewDataSource-Beispiel, das funktioniert und vielleicht ein wenig einfacher zu verstehen ist.
Generische Typen:
%Vor%Konkrete Klassen, die auf dem obigen Code basieren:
%Vor%Edit: Sie Unterklasse kann auch mit verschiedenen Arten von Zellen arbeiten, wenn Sie möchten.
%Vor%Hoffe, das hilft! Viel Glück!