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ückzugebenDieser Beitrag ist als Duplikat gekennzeichnet, aber diese andere Frage bezieht sich auf Javascript, nicht auf Swift.
Ich habe endlich den Weg dafür gefunden, nämlich NSArray
für das Casting zu verwenden.
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.)
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):
Dann nenne es so:
%Vor%Ausgaben:
%Vor%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%