2016-06-16 5 views
3

Ich habe gelernt, dass Swift-Zeichenfolgen nicht mit ganzzahligen Werten indiziert werden können. Ich erinnerte mich daran und ich benutze die Regel. Aber ich habe die Mechanik dahinter nie verstanden.Warum Zeichenfolgen nicht mit ganzzahligen Werten indiziert werden können

Die Erklärung aus dem offiziellen Dokument ist als

"Verschiedene Zeichen folgt unterschiedliche Mengen an Speicher zum Speichern erfordern kann, so um die Rolle zu bestimmen, an einer bestimmten Position ist, müssen Sie über jedes Unicode iterieren Skalar vom Anfang oder Ende des Strings. Aus diesem Grund können Swift-Strings nicht mit ganzzahligen Werten indiziert werden. "

Ich habe es mehrmals gelesen, ich verstehe es immer noch nicht ganz. Kann mir jemand ein bisschen mehr erklären, warum Swift String nicht durch ganzzahlige Werte indiziert werden kann?

Vielen Dank

+0

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html - das ist das Thema, über das Sie sprechen. Für mich wird es ziemlich schwer sein, klarer zu erklären, als wenn Sie dieses Thema von Anfang bis Ende lesen. –

+4

Kurzer Hinweis, keine vollständige Erklärung: Swift Zeichenketten respektieren Unicode, und einige Emojis, zum Beispiel, sind "zusammengesetzte" Zeichen, sie erscheinen als ein Zeichen, aber sie können tatsächlich bis zu vier echte Zeichen verwenden - es ist nur, dass wir nicht Sieh es, die verschiedenen Charaktere werden in einem zusammengefasst, wenn sie angezeigt werden. Deshalb können wir uns in Swift nicht auf den "Index" eines Zeichens in einer Zeichenkette verlassen. – Moritz

+0

@Moritz, das erklärt, warum Sie die ganzzahlige Indexierung nicht implementieren können, indem Sie sie den entsprechenden Unicode-Codepunkten zuordnen, wie sie im Speicher erscheinen, aber dies verhindert nicht die Implementierung einer Schnittstelle, in der 'myString [8]' dem entspricht 7. kanonisches Symbol in 'myString'. Ihr Tipp ist absolut richtig, aber das obige ist warum ich - und wahrscheinlich auch andere - die Frage nachschlagen. –

Antwort

1

Eine Zeichenkette wird im Speicher als ein Array von Bytes gespeichert.

Ein gegebenes Zeichen kann 1 bis 4 Byte für den grundlegenden Codepunkt plus eine beliebige Anzahl von diakritischen Zeichen erfordern.

Zum Beispiel benötigt é 2 Bytes.

Nun, wenn Sie die Saiten haben efgh und éfgh, das zweite Zeichen zuzugreifen (f), für die erste Zeichenfolge, die Zeichen in dem Byte-Array bei Index 1, für die zweite Saite, ist es an dem Index 2 .

Um das zu wissen, müssen Sie das erste Zeichen prüfen. Um auf ein beliebiges Zeichen basierend auf seinem Index zuzugreifen, müssen Sie alle vorherigen Zeichen durchlaufen, um zu wissen, wie viele Bytes jedes Zeichen benötigt.

+0

Zeichen können viel breiter als 4 Bytes sein. '" g͇̫͛͆̾ͫ̑͆ ".characters.count == 1 &&" g͇̫͛͆̾ͫ̑͆ ".lengthOfBytes (using: .utf8) == 17' –

+0

@BrianNickel Ja, ich habe vergessen, dass Sie Diakritika hinzufügen und kombinieren können. (In meinem Beispiel existiert é auch als eigenständiges Zeichen). Aber jeder Codepunkt ist in 1 bis 4 Bytes codiert. – njzk2

Verwandte Themen