Ich habe bereits eine question geschrieben, aber es war nicht klar, was ich will. Wie @AlainT vorgeschlagen hat, habe ich einen neuen eingereicht.Generic View Controller wird nicht mit Delegaten und Erweiterungen
Ich habe eine typealias Tupel
public typealias MyTuple<T> = (key: T, value: String)
Ein Protokoll:
public protocol VCADelegate: class {
associatedtype T
func didSelectData(_ selectedData: MyTuple<T>)
}
A-View-Controller (VCA) mit einer Tabellenansicht
class VCA<T>: UIViewController, UITableViewDelegate, UITableViewDataSource {
var dataList = [MyTuple<T>]()
weak var delegate: VCADelegate? // Error: can only be used as a generic constraint
// ...
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.didSelectData(dataList[indexPath.row])
}
}
in einer anderen Ansicht Regler (VCB) Ich erstelle eine VCA und durchlaufe eine DataList
func callVCA() {
let vcA = VCA<String>()
vcA.dataList = [(key: "1", value:"Value 1"),
(key: "2", value:"Value 2")]
}
Ich möchte eine DataList haben, ohne den Datentyp des Schlüssels in VCA zu kennen. Nur wenn VCB VCA aufruft, kenne ich den Datentyp des Schlüssels. Das Erstellen eines generischen View-Controllers führt zu einem Problem mit dem Delegaten. Gibt es eine Möglichkeit, dieses Problem zu lösen, ohne zum Abschluss der Schließung wechseln zu müssen?
Das andere Problem der Verwendung eines generischen View-Controllers ist, dass ich es nicht erweitern kann. Irgendeine Idee?
"Was ich will Zu tun ist, eine Datenliste zu haben, ohne den Datentyp des Schlüssels in VCA zu kennen. Nur wenn VCB VCA aufruft, dann kenne ich den Datentyp des Schlüssels. " Es ist unklar, was du hier meinst. Wenn VCB den zugehörigen VCA-Typ kennt (um ihn zu nennen), wie Sie es sagen, woher kennt er dann den Typ nicht? Was ist das "Problem mit dem Delegierten?" Nichts hier scheint VCA als eine Eigenschaft zu speichern; Ist es nur eine lokale Variable? (Wenn ja, was ist der aufrufende Code? Es scheint, dass Sie T == String hart codiert haben, also wo weißt du das nicht?) –
Das Problem mit dem Delegaten ist in meinem Kommentar richtig: "kann nur als verwendet werden eine generische Einschränkung ... " – Lawliet
Was ich meine, ist in VCA, ich weiß nicht, Datentyp von MyTuple Schlüssel. Nur VCB kennt es. Von VCB konnte ich entweder String, Int oder einen anderen Datentyp an den MyTuple-Schlüssel übergeben. "Nichts scheint hier VCA als Eigenschaft zu speichern", wenn Sie den letzten Codeblock nicht verstehen. Ich habe es in eine Funktion gebracht. – Lawliet