Wie erkennt man, ob eine Variable ein Array ist?

8

Ich habe eine Swift-Funktion, die Any akzeptiert und ich möchte, dass sie ein Array von Strings, ein Array von Ints, ein gemischtes Array oder ein Array von Arrays usw. akzeptiert. Es kann auch nur einen String oder akzeptieren ein Int, etc, nicht in einem Array.

So habe ich das:

%Vor%

Aber wenn ich parse(["Strings"]) aufruft, wird die Assertion ausgelöst. Wie kann ich alle Arten von Arrays fangen?

bearbeiten - es gab einige Verwirrung darüber, was ich zu erreichen versuche. Ich muss im Grunde eine Zeichenfolge basierend auf dem Typ zurückgeben, so Int - & gt; "" und String - & gt; "", also würde ein Array rekursive Aufrufe machen, um "..."

zurückzugeben

Dieser Beitrag ist als Duplikat gekennzeichnet, aber diese andere Frage bezieht sich auf Javascript, nicht auf Swift.

    
Ryan 07.10.2014, 00:40
quelle

4 Antworten

9

Ich habe endlich den Weg dafür gefunden, nämlich NSArray für das Casting zu verwenden.

%Vor%

Es sieht so aus, dass ein Array, das Werte von Any enthält, intern in NSArray dargestellt wird. (Aber sollte es in der Lage sein, c auf [Any] zu setzen? Ich vermute, dass es ein Fehler ist.)

    
findall 07.10.2014, 02:49
quelle
2

Eine Möglichkeit besteht darin, die Funktion in zwei separate Implementierungen (mit demselben Namen) zu trennen, von denen eine für Array und eine für alles andere gilt. Sie müssen sie auch zu generischen Funktionen machen, anstatt den Any -Typ zu verwenden. Mit diesem Setup kann Swift Typ-Inferenz verwenden, um die beste Funktion zum Aufrufen herauszufinden.

Ich würde es so etwas implementieren (ich bin nur println den Typ um zu zeigen, wo die Dinge enden):

%Vor%

Dann nenne es so:

%Vor%

Ausgaben:

%Vor%     
Mike S 07.10.2014 01:30
quelle
2

Der Schlüssel zum Verständnis von Eingabe und typbezogenen Problemen in Swift ist, dass alle Wege zu Protokollen führen.

Die Herausforderung dieses Problems besteht darin, irgendeinen Array-Typ zu erkennen, nicht nur einen konkreten Typ. Das Beispiel des OP ist fehlgeschlagen, weil [Any] keine Basisklasse oder ein verallgemeinertes Muster von [String] ist, das heißt, (was ich sagen kann), in Swift [T] ist nicht kovariant auf T . Darüber hinaus können Sie nicht nach SequenceType oder CollectionType suchen, da diese Typen zugeordnet sind (Generator.Element).

Die idiomatische Lösung besteht also darin, ein marker Protokoll zu verwenden, um anzugeben, welche Typen Ihren Kriterien entsprechen sollen. Wie unten dargestellt, erreichen Sie dies, indem Sie ein leeres Protokoll erstellen und es mit den interessanten Typen verknüpfen.

%Vor%

Die Ausgabe von ist:

%Vor%     
Chris Conover 28.01.2016 00:48
quelle
0

Sie können _stdlib_getTypeName verwenden, das den Namen des Mangled-Typs für den angegebenen Wert zurückgibt.

Zum Beispiel:

%Vor%

Das Ergebnis wird sein:

%Vor%     
Sebastian 07.10.2014 01:17
quelle

Tags und Links