Ich habe eine Klasse, die an einen Delegaten aufrufen muss, wenn sich eine seiner Eigenschaften ändert. Hier sind die vereinfachte Klasse und das Protokoll für den Delegierten:Swift-Delegat für eine generische Klasse
protocol MyClassDelegate: class {
func valueChanged(myClass: MyClass)
}
class MyClass {
weak var delegate: MyClassDelegate?
var currentValue: Int {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: Int) {
currentValue = initialValue
}
}
Das alles funktioniert gut. Aber ich möchte diese Klasse generisch machen. Also, ich habe es versucht:
protocol MyClassDelegate: class {
func valueChanged(genericClass: MyClass)
}
class MyClass<T> {
weak var delegate: MyClassDelegate?
var currentValue: T {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: T) {
currentValue = initialValue
}
}
Dies wirft zwei Compilerfehler. Zuerst gibt die Zeile, die valueChanged
in dem Protokoll deklariert, Reference to generic type 'MyClass' requires arguments in <...>
. Zweitens, der Anruf an valueChanged
im didSet
Watcher wirft: 'MyClassDelegate' does not have a member named 'valueChanged'
.
Ich dachte, ein typealias
mit würde das Problem lösen:
protocol MyClassDelegate: class {
typealias MyClassValueType
func valueChanged(genericClass: MyClass<MyClassValueType>)
}
class MyClass<T> {
weak var delegate: MyClassDelegate?
var currentValue: T {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: T) {
currentValue = initialValue
}
}
ich auf dem richtigen Weg zu sein scheinen, aber ich habe noch zwei Compiler-Fehler. Der zweite Fehler von oben bleibt ebenso wie ein neuer auf der Zeile, die die delegate
-Eigenschaft von MyClass
deklariert: Protocol 'MyClassDelegate' can only be used as a generic constraint because it has Self or associated type requirements
.
Gibt es eine Möglichkeit, dies zu erreichen?
Das ist genau das, was ich brauchte ... Dank. – GarlicFries
Für das, was es wert ist, wird 'valueChanged' im obigen Code im' didSet' Watcher auf 'currentValue' aufgerufen. – GarlicFries
Große Antwort. Ich konnte einen Delegaten für meine generische Klasse erstellen. Ich habe eine weitere Frage. Wie kann ich herausfinden, welcher Objekt-generische Delegat die generische Delegatfunktion aufruft?Ding1 oder Ding2? Bitte sieh dir diesen Grund an. https://gist.github.com/zakkhoyt/0b2543bb5a5995b41e73bef83391c378 – VaporwareWolf