Dieser Codeabschnitt funktioniert wie erwartet. "integer is int" wird in Ausgabe ausgegeben.
%Vor% Ich möchte is
operator auf die gleiche Weise verwenden, wie ich isKindOfClass
method verwenden kann - mit der in Variable gespeicherten Klasse (oder vielmehr Art). Es würde so aussehen:
Leider ergibt dies einen Fehler: Use of undeclared type 'IntType'
.
IntType
in if
condition hat sogar eine andere Farbe (wenn Sie es in playground einfügen) als an anderen Stellen im Quelltext, was darauf hindeutet, dass (wie die Fehlermeldung sagt) es als Klassenname behandelt wird (wie IntType
wäre eine Klasse). Aber es ist nicht. Dies bedeutet, dass is
operator nicht mit Variablen auf der rechten Seite verwendet werden kann?
Ich möchte den Operator is
verwenden, da er nicht nur Klassen, sondern auch andere Typen vergleichen kann.
Wie kann ich prüfen, ob der Wert den Typ hat, den ich erwarte?
Ich fand schmutzige Lösung, aber es ist wirklich weit davon entfernt, zuverlässig zu sein ...
%Vor%Funktioniert perfekt, aber sei vorsichtig - denn das stimmt auch:
%Vor%Gibt es einen besseren Weg?
Ok, ich werde weiter erklären, was ich erreichen möchte. Ich habe ein Objekt, das Instanzen von generischen Klasseninstanzen verwaltet. Irgendwann muss ich eine dieser generischen Klasseninstanzen auswählen, die auf dem generischen Typ basieren. Beispiel:
%Vor% Momentan habe ich ToolInfo
struct, weil es meines Wissens nicht möglich ist, den Typ in <>
zu übergeben, während das generische Klassenobjekt instanziiert wird. Aber ich kann es immer noch nicht vergleichen.
Es bedeutet, dass is Operator nicht mit Variablen auf der rechten Seite verwendet werden kann?
Richtig. Die rechte Seite von is
muss zur Kompilierzeit fest codiert sein.
Wenn Sie keinen Polymorphismus benötigen und Ihre Typen Klassentypen sind, können Sie ===
verwenden, um dynamicType
einer Instanz mit einem Klassentyp zu vergleichen. Das ist der einzige Weg, wie Sie eine Art-in-a-Variable auf der rechten Seite von etwas in reinem Swift bekommen.