Ich bin verwirrt über dynamische Überprüfung in Swift.Schnelle dynamische Typüberprüfung für Strukturen?
Insbesondere habe ich ein Weirdo Fall, wo ich möchte im Wesentlichen wissen, schreiben (oder zu finden) eine Funktion:
func isInstanceOf(obj: Any, type: Any.Type) -> Bool
In Objective-C, das isKindOfClass
ist, aber das wird nicht funktionieren, weil Any.Type
enthält Swift-Strukturen, die keine Klassen sind (weniger NSObject
Unterklassen).
Ich kann Swift is
hier nicht verwenden, weil das einen hardcoded Typ erfordert.
Ich kann obj.dynamicType == type
nicht verwenden, weil das Subklassen ignorieren würde.
Die Swift book scheint darauf hinzudeuten, dass diese Informationen verloren, und für structs überhaupt nicht zur Verfügung:
Klassen verfügen über zusätzliche Funktionen, die Strukturen nicht:
...
- Typumwandlung ermöglicht Ihnen, den Typ einer Klasseninstanz zur Laufzeit zu prüfen und zu interpretieren.
(Auf der Type Casting Kapitel, sagt er "in Swift Typ Gießen mit dem IS und als Betreiber implementiert ist", so dass es eine breitere Definition von "type casting" als in other languages zu sein scheint.)
Allerdings kann es nicht sein, dass is
/as
nicht mit Strukturen arbeiten, da Sie Strings und Ints in eine [Any]
setzen können, und sie später herausziehen, und verwenden Sie is String
oder is Int
, um herauszufinden, was sie waren . Das Type Casting Kapitel des Swift Books macht genau das!
Gibt es etwas, das so leistungsstark ist wie isKindOfClass
, aber für alle Swift-Instanzen? Diese Information muss zur Laufzeit noch existieren, oder?
FYI, mehr Informationen zu dem, was Sie eigentlich tun möchten, wäre hilfreich :) – PeejWeej
Ich denke, ich habe ziemlich genau destilliert, was ich versuche zu tun. Ich habe einige Eingaben, die einen Typ enthalten, und ich möchte (zum Beispiel) eine '[Any]' - Sammlung nur für Mitglieder dieses Typs filtern. Ich kann es mit einer großen if-else-Kette oder einer switch-Anweisung machen, die alle möglichen Typen auflistet, aber das ist schrecklich hässlich (ganz zu schweigen von redundant und nicht wiederverwendbar). Außerdem versuche ich zu lernen, wie das alles tatsächlich in der Erinnerung funktioniert, denn wie geschrieben, scheint das Swift-Sprachbuch selbst widersprüchlich zu sein. –