Unterschied zwischen String und StaticString
Ich war das surfen im docs, und ich fand StaticString
. Es besagt:
Eine einfache Zeichenfolge, die die Darstellung von text, die "erkennbar zur compile-Zeit".
Ich ursprünglich dachte, dass String
hat das gleiche Verhalten wie NSString
, die zur Kompilierzeit bekannt ist, aber es sieht so aus, dass ich falsch lag. Also meine Frage ist Wann sollen wir verwenden StaticString
statt einer String
, und der einzige Unterschied ist, dass StaticString
bekannt ist zur compile-Zeit?
Eine Sache, die ich fand, ist
var a: String = "asdf" //"asdf"
var b: StaticString = "adsf" //{(Opaque Value), (Opaque Value), (Opaque Value)}
sizeofValue(a) //24
sizeofValue(b) //17
So wie es aussieht StaticString
hat ein bisschen weniger Speicherbedarf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, dass
StaticString
können string-Literale. Sie können nicht zuweisen einer variable vom TypString
zu es, und es kann nicht mutiert (mit+=
zum Beispiel)."Erkennbar zur compile-Zeit" bedeutet nicht, dass der Wert gehalten, der durch die variable bestimmt werden, die zur compile-Zeit, nur dass kein Wert zugewiesen ist, ist es zur Kompilierzeit bekannt ist.
Betrachten Sie dieses Beispiel, das funktioniert:
Jede Zeit, die Sie geben können, Swift mehr Informationen darüber, wie eine variable verwendet werden, es können optimieren Sie den code verwenden. Durch die Beschränkung auf eine variable
StaticString
Swift kennt die variable nicht mutiert, so dass es speichern kann, ist es effizienter, und der Zugriff auf die einzelnen Zeichen effizienter zu gestalten.In der Tat
StaticString
umgesetzt werden könnte, mit nur einer Adresse-Zeiger und eine Länge. Die Adresse verweist, ist nur der Ort, in den statischen code, wo die Zeichenkette definiert ist. EinStaticString
brauchen wir nicht zu verweisen gezählt, da es sich nicht (müssen) gibt es in den heap. Es ist weder zugewiesen noch freigegeben, so dass keine Referenz-Zählung benötigt werden."Erkennbar zur compile-Zeit" ist ziemlich streng. Auch dies funktioniert nicht:
welche schlägt fehl mit Fehler:
StaticString
s werden nicht mutiert, aber Sie können neu zugewiesen werden, wie gut. Also im Grunde der compiler nicht sicher sein kann, über Ihren Wert.StaticString
halten wird zur compile-Zeit, aber es muss wissen, dass jeder Wert, der zugewiesen werden soll, die variable ist ein string-literal, das war zur Kompilierzeit bekannt ist. Was Swift wird tun, mit diesen Informationen ist nur bekannt, zu der Autoren von Swift, bis Sie release der open-source-code.StaticString
erkennbar ist zur compile-Zeit. Dies kann dazu führen Optimierungen durch. Beispiel:EDIT: Das Teil funktioniert nicht, siehe edit unten
Angenommen, Sie haben eine Funktion, die berechnet, der
Int
für einigeString
Werte für einige Konstanten, die Sie definieren, die zur compile-Zeit.Wie diese, würde die Funktion ausgeführt werden, die mit "Test" und "Hallo", wenn es wirklich aufgerufen wird, in das Programm, wenn die app startet, zum Beispiel. Auf jeden Fall bei der Laufzeit. Jedoch, wenn Sie ändern Ihre Funktion zu nehmen
StaticString
weiß der compiler, dass die Weitergabe in
StaticString
erkennbar ist zur compile-Zeit, so denke, was es tut? Es führt die Funktion rechts zur compile-Zeit (Wie genial ist das!). Ich Las einmal einen Artikel über die Autorin überprüft die generierte assembly, und er fand tatsächlich die bereits berechnete zahlen.Wie Sie sehen können, dies kann nützlich sein, in einigen Fällen, wie erwähnt, nicht ab-Laufzeit-performance für Dinge, die getan werden kann zur compile-Zeit.
EDIT: Dániel Nagy und mir hatte ein Gespräch. Das obige Beispiel von mir funktioniert nicht, da die Funktion
stringValue
vonStaticString
können nicht zum Zeitpunkt der Kompilierung bekannt (denn es gibt eineString
). Hier ist ein besseres Beispiel:In einem release-build nur die zweite breakpoint wird ausgelöst, in der Erwägung, dass, wenn Sie ändern die erste Funktion zu
beide Haltepunkte ausgelöst.
Anscheinend gibt es einige Methoden, die getan werden kann zur compile-Zeit, während andere nicht können. Ich Frage mich, wie der compiler die zahlen das tatsächlich.
StaticString
, sollte es nicht einmal eingeben?String
als gut:SString
,StaticString
ist hier nicht unbedingt erforderlich