Während jede Art Any
entspricht, dann ist dies nicht das gleiche wie es eine universelle implizite geordnete Klasse zu sein, dass alle Arten von erben.
Wenn Sie einen Typ in ein Protokoll umwandeln, erstellen Sie einen neuen Wert mit einer anderen Struktur.Also für eine Reihe von Typ sein Any
, muss er physisch von der String
Darstellung umgewandelt werden:
sizeof(String) // 24 bytes (on 64-bit, anyway)
zur Any
Darstellung:
sizeof(Any) // 32 bytes, includes some meta data
// about what the type really is
Da Werttypen direkt im Array gehalten werden, das Array würde eine ganz andere Form haben, so dass der Compiler unter der Haube das Äquivalent dazu hätte:
Swift könnte diesen Prozess möglicherweise für Sie automatisieren (wenn Sie eine einzelne Variable an eine Funktion übergeben, die Any
dauert). Aber persönlich bin ich froh, dass es nicht ist, ich würde eher das expliziter sein - nehmen Sie an, dass Ihr Array riesig war, würde dies eine Menge von Verarbeitung implizit unter der Haube passieren.
Dies unterscheidet sich von, wenn Sie eine Reihe von Referenztypen haben, von denen alle Zeiger auf die aktuellen Daten sind und so alle die gleiche Größe und die brauchen keine Transformation, wenn Upcasting:
class C { }
class D: C { }
let d = D()
let c: C = d
unsafeBitCast(d, UnsafePointer<Void>.self) // these value will
unsafeBitCast(c, UnsafePointer<Void>.self) // be the same
So sagen „diese Reihe von [D]
ist wirklich eine Reihe von [C]
“ nur eine Frage des Compilers ist die Art Vereinbarung ersetzt werden kann, braucht keine Datentransformation zu:
// so this works fine,
// no runtime transformation needed:
func f(cs: [C]) { }
let ds = [D(),D()]
f(ds)
Aber Protokolle sind noch anders Super Referenzen, wenn sie mit Klassen verwendet:
protocol P { }
extension C: P { }
sizeofValue(C()) // 8 bytes (just a pointer)
sizeofValue(C() as P) // 40 bytes
func g(ps: [P]) { }
g(ds) // won’t compile, needs transformation
Daumen nach oben für Namen im Array :) –
Kann nicht für eine schnelle sprechen, aber in den meisten Sprachen könnte dies ein Problem sein, weil 'printItems' das Array von' Any' nehmen könnte und ändern Sie eines der Elemente zu - nun - alles, was es wollte (etwas anderes als eine Zeichenfolge). Aber der Aufrufer denkt, dass sie ein Array von "Strings" haben, so dass Probleme auftreten können, wenn "printItems" beendet ist. Gilt das für schnelle? –
Was passiert, wenn Sie den Typ Ihres Namensarrays in '[Beliebige]' ändern –