Diesen Code:
class C <T: MyProtocol> { }
Bedeutet, dass C
eine generische Klasse, die auf jeder Art spezialisieren T
, die entsprichtMyProtocol
.
Wenn Sie erklären:
var obj: C <MyProtocol>
Sie sind (glaube ich) versuchen, die var obj
eine Instanz von C
auf irgendeine Art spezialisiert sein wird, die, zu sagen, dass zu MyProtocol
entspricht aber Sie nicht spezialisieren generische Klasse für einen Protokolltyp, da es keine direkte konkrete Instanz eines Protokolls gibt. Es kann nur Instanzen eines Typs konform zu zum Protokoll geben. Und es kann theoretisch viele verschiedene Typen geben, die dem Protokoll entsprechen. Diese Notation sagt dem Compiler nicht wirklich, welche spezielle Spezialisierung von C
zu verwenden ist.
Dies sollte aber kein Problem sein, weil man Dinge wie schreiben:
var obj: C<P1> = C<P1>()
oder
var obj = C<P2>() // type is inferred
Und in Ihrer Klasse C
Sie noch irgendwelche Verwendungen von T
behandeln kann als konform zu MyProtocol
. Ich denke, das sollte Ihnen alles geben, was Sie brauchen, solange Sie sich daran erinnern, dass eine Instanz einer generischen Klasse auf einen bestimmten konkreten Typ spezialisiert sein muss, nicht ein Protokoll, das viele mögliche konkrete Typen repräsentieren könnte.
Vielen Dank für Ihre Antwort, ich brauche ein Array, um die Instanzen der Klasse C zu speichern. var array = [C](), aber dies wird auch kompiliert Fehler. Wie kann ich das machen? –
chk58