Swift "ist" -Operator mit in Variablen gespeicherten Typen

8

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:

%Vor%

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.

    
luleq 06.08.2015, 14:18
quelle

2 Antworten

6
  

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.

    
matt 06.08.2015, 19:12
quelle
-2

Hier ist mein Experiment mit enum type container (sorry, geschrieben struct versehentlich im Kommentar früher):

%Vor%

Sie können so etwas in Ihrem Projekt tun.

    
rshev 06.08.2015 18:29
quelle

Tags und Links