Ich habe ein Array, das besteht AnyObject
. Ich möchte darüber iterieren und alle Elemente finden, die Array-Instanzen sind.
Wie kann ich in Swift überprüfen, ob ein Objekt von einem bestimmten Typ ist?
swift
type-inference
typechecking
Encore PTL
quelle
quelle
Antworten:
Wenn Sie mit einem bestimmten Typ vergleichen möchten, können Sie Folgendes tun:
Sie können "as!" und das wird einen Laufzeitfehler auslösen, wenn
obj
nicht vom Typ ist[String]
Sie können auch jeweils ein Element überprüfen:
quelle
?
nicht vorhanden ist? Es klingt wieas
und?
wenn sie kombiniert werden Laufzeitüberprüfung durchführen. Wann wäre es angebracht,as
ohne zu verwenden?
? Danke im Voraus.as
ohne verwenden,?
wenn Ihr Programm auf keinen Fall von dem Objekt wiederhergestellt werden kann, das nicht von diesem Typ ist, da das Programm sofort angehalten wird, wenn dies nicht der Fall ist. Mit der?
in derif
Anweisung kann das Programm fortgesetzt werden.?
in diesem Fall eine "generische" Typprüfung durchführen würde, wenn ja, zur if-Klausel, wenn nicht, zur else-Klausel. Ohne das?
würde sonst nie eingegeben werden und wie Sie betonten, einen Laufzeitfehler verursachen. Danke noch einmal.?
ermöglicht die Rückgabe der Zuweisung,nil
wodurch die if-Anweisung zurückgegeben wirdfalse
und somit zur else-Anweisung durchfällt. Ich denke jedoch, dass die Erklärung beim Verständnis hilft, aberif let
tatsächlich ein Sonderfall im Compiler istIn Swift 2.2 - 5 können Sie jetzt Folgendes tun:
Dann filtern Sie Ihr Array:
Wenn Sie mehrere Typen überprüfen müssen:
quelle
object
alsString
Innenseite der Klammern verwenden (zumindest in Swift 2), während Sie dies mit derlet
Lösung tun können.object
im Block in Ordnung ist.object.uppercaseString
weil der Typ der Variablen nicht in diesen Typ umgewandelt wird. Sie haben nur überprüft, dass das Objekt (auf das die Variable zeigt) ein istString
Wenn Sie nur wissen , ob ein Objekt ist ein Subtyp eines bestimmten Typs dann gibt es einen einfacheren Ansatz ist:
„Verwenden Sie den Typprüfungsoperator (is), um zu überprüfen, ob eine Instanz von einem bestimmten Unterklassentyp ist. Der Typprüfungsoperator gibt true zurück, wenn die Instanz von diesem Unterklassentyp ist, und false, wenn dies nicht der Fall ist. “ Auszug aus: Apple Inc. "Die schnelle Programmiersprache". iBooks .
Oben ist der Ausdruck "eines bestimmten Unterklassentyps" wichtig. Die Verwendung von
is Circle
undis Rectangle
wird vom Compiler akzeptiert, da dieser Wertshape
alsShape
(eine Oberklasse vonCircle
undRectangle
) deklariert ist .Wenn Sie primitive Typen verwenden, wäre die Oberklasse
Any
. Hier ist ein Beispiel:quelle
is
noch funktionieren, wenn ich einen primitiven Typ in einem Array gespeichert hätte oder wenn das Array vom primitiven Typ ist ? Vielen Dank.object
als deklarierenAny
. Mit einem Beispiel aktualisiert.AnyObject
vorgeschlagen wird, eine Erwiderung erfolgt zu sein scheint, weil ichAnyObject
nicht von geerbt habeNSObject
. Wenn diesAny
anders ist, wäre dies in der Tat auch eine großartige Lösung. Vielen Dank.Ich habe zwei Möglichkeiten:
Oder:
Hier ist ein detailliertes Beispiel:
Edit: 3 jetzt:
quelle
isKindOfClass
ist eine Methode desNSObject
Protokolls; Es sollte nur für Klassen funktionieren, die es übernehmen (alle Klassen, die von NSObject abstammen, sowie alle benutzerdefinierten Swift-Klassen, die es explizit übernehmen)für swift4:
quelle
Angenommen, drawTriangle ist eine Instanz von UIView. So prüfen Sie, ob drawTriangle vom Typ UITableView ist:
In Swift 3 ,
Dies kann auch für von Ihnen definierte Klassen verwendet werden. Sie können dies verwenden, um Unteransichten einer Ansicht zu überprüfen.
quelle
Warum nicht die speziell für diese Aufgabe entwickelte Funktionalität nutzen?
quelle
Seien Sie gewarnt:
Alle vier letzten Zeilen geben true zurück. Dies liegt daran, dass Sie eingeben
... es wird natürlich "false" ausgegeben, aber eine Warnung besagt, dass die Umwandlung von CGRect in String fehlschlägt. Einige Typen werden also überbrückt, und das Schlüsselwort 'is' ruft eine implizite Umwandlung auf.
Sie sollten besser eines davon verwenden:
quelle
Wenn Sie die Klasse aufgrund des nicht verwendeten definierten Werts (let someVariable ...) nur überprüfen möchten, ohne eine Warnung zu erhalten, können Sie das let-Zeug einfach durch einen Booleschen Wert ersetzen:
Xcode schlug dies vor, als ich den let-Weg verwendete und den definierten Wert nicht verwendete.
quelle
Warum nicht so etwas benutzen?
in Swift 3.
quelle
Swift 4.2, In meinem Fall mit der isKind-Funktion.
Lesen Sie mehr https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
quelle
myObject as? String
gibt zurück,nil
wennmyObject
nicht aString
. Andernfalls wird a zurückgegebenString?
, sodass Sie mit auf die Zeichenfolge selbst zugreifenmyObject!
oder siemyObject! as String
sicher umwandeln können.quelle
Swift 3:
quelle
Nur der Vollständigkeit halber basierend auf der akzeptierten Antwort und einigen anderen:
Sie können aber auch (
compactMap
auch die Werte "abbilden", wasfilter
nicht der Fall ist):Und eine Version mit
switch
:Aber bleiben Sie bei der Frage, um zu überprüfen, ob es sich um ein Array handelt (dh
[String]
):Oder allgemeiner (siehe diese andere Frage Antwort ):
quelle
as?
gibt Ihnen nicht immer das erwartete Ergebnis , daas
nicht testen , ob ein Datentyp ist von einer bestimmten Art , sondern nur dann , wenn ein Datentyp werden kann umgewandelt oder als dargestellt spezifische Art.Betrachten Sie diesen Code zum Beispiel:
Jeder dem
Error
Protokoll entsprechende Datentyp kann in einNSError
Objekt konvertiert werden, sodass dies immer erfolgreich ist . Dies bedeutet jedoch nicht, dasserror
es sich tatsächlich um einNSError
Objekt oder eine Unterklasse davon handelt.Eine korrekte Typprüfung wäre:
Dies prüft jedoch nur den genauen Typ. Wenn Sie auch eine Unterklasse von einschließen möchten
NSError
, sollten Sie Folgendes verwenden:quelle
Wenn Sie eine Antwort wie diese haben:
und Sie möchten nach Werten
is_stucked
suchen, die als AnyObject gelesen werden. Alles, was Sie tun müssen, ist diesquelle
Wenn Sie nicht wissen, dass Sie in der Antwort vom Server ein Array von Wörterbüchern oder ein einzelnes Wörterbuch erhalten, müssen Sie überprüfen, ob das Ergebnis ein Array enthält oder nicht.
In meinem Fall immer eine Reihe von Wörterbüchern erhalten, außer einmal. Um damit umzugehen, habe ich den folgenden Code für Swift 3 verwendet.
Hier als? Array prüft, ob der erhaltene Wert ein Array (von Wörterbuchelementen) ist. In anderen Fällen können Sie damit umgehen, ob es sich um ein einzelnes Wörterbuchelement handelt, das nicht in einem Array gespeichert ist.
quelle
Swift 5.2 & Xcode Version: 11.3.1 (11C504)
Hier ist meine Lösung zur Überprüfung des Datentyps:
Ich hoffe es hilft dir.
quelle