Ich möchte eine Methode wie diese für meine Projekte erstellen:
%Vor% Aber ich kann nicht, weil CGRect
und CGSize
struct
s sind und nicht mit AnyObject
protocol
übereinstimmen. Also, irgendwelche Ideen, wie das gemacht werden könnte?
@ nkukushkins Antwort ist korrekt, wenn Sie jedoch eine Funktion haben wollen, die sich je nachdem, ob sie ein CGRect
oder ein CGStruct
übergeben hat, anders verhält, ist das Überladen besser:
Im Vergleich dazu wird Any
ineffizient sein (das Konvertieren Ihrer Strukturen in Any
und zurück, kann große Auswirkungen haben, wenn Sie dies in einer engen Schleife tun) und nicht typsicher (Sie können bestehen alles in diese Funktion, und es wird nur zur Laufzeit fehlschlagen.
Wenn Sie beide Typen in einen gemeinsamen Typ zwingen und dann dieselbe Operation ausführen möchten, können Sie eine dritte Überladung erstellen, die diesen Typ annimmt und von den anderen beiden aufrufen.
Verwenden Sie Any
anstelle von AnyObject
.
Swift bietet zwei spezielle Aliase für die Arbeit mit unspezifischen Typen:
•
AnyObject
kann eine Instanz einer beliebigen Klassenart darstellen.
•Any
kann eine Instanz eines beliebigen Typs darstellen, einschließlich der Funktionstypen.
Habe gerade eine viel bessere Methode entdeckt, dies zu tun. Swift hat eine Methode namens dump und es funktioniert mit vielen Arten von Daten.
Zum Beispiel:
%Vor%Wird gedruckt:
%Vor% Wenn Sie nur ein CGRect
oder CGSize
drucken möchten, könnten Sie Folgendes verwenden:
oder
%Vor% Sie haben am Ende Ihrer Funktion ein "..." hinterlassen, also nehme ich an, dass es mehr Typen gibt, die Sie drucken müssen. Dazu müssen Sie diese Typen dem Printable
-Protokoll anpassen (sofern sie dies nicht bereits tun). Hier ist ein Beispiel dafür, wie -
Das können Sie verwenden:
%Vor% Sie können auch das Format ändern, in dem ein Typ gerade gedruckt wird. Wenn Sie beispielsweise println(aRect)
im selben Format wie von NSStringFromCGRect
erhalten möchten, können Sie die Erweiterung verwenden: