String-Länge in Swift: Nicht nur count, sondern ein ganzes Abenteuer

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum ist die „String-Länge“ nicht einfach eine Zahl?

\n\n

Stellen Sie sich vor, Sie schreiben eine App für iOS. Der Benutzer gibt seinen Namen in ein Textfeld ein. Ganz einfach? Und wenn der Name Emojis, diakritische Zeichen (z. B. „café“) oder Hieroglyphen enthält? Plötzlich wird die einfache Aufgabe „Ermittle die Länge eines Strings“ zu einem Krimi mit Unicode-Elementen.

\n\n

In Swift ist die Arbeit mit Strings nicht nur das Zählen von Zeichen. Es ist eine Reise in die Welt der Graphemcluster, Unicode-Skalare und das Erbe von Objective-C (ja, NSString ist immer noch bei uns). Wenn Sie gerade erst anfangen, Swift zu lernen, oder von anderen Sprachen umsteigen, ist dieser Artikel für Sie. Wir werden analysieren, wie man die Länge eines Strings korrekt bestimmt, welche Fallstricke auf Sie warten und wann Sie count und wann NSString verwenden sollten.

\n\n

Dieses Material basiert auf einer echten, beliebten Frage von Stack Overflow. Tausende von Entwicklern sind über dieses Thema gestolpert. Lassen Sie uns ihre Fehler nicht wiederholen. Los geht's!

\n\n
\n\n

1. Grundlagen: Die count-Eigenschaft von String

\n\n

Der offensichtlichste Weg, die Länge eines Strings in Swift zu ermitteln, ist die Verwendung der Eigenschaft count. Sie gibt die Anzahl der „Zeichen“ (Character) in einem String zurück. Aber was ist für Swift ein Zeichen?

\n\n
let greeting = "Привет, мир!"\nprint(greeting.count) // 12 (einschließlich Leerzeichen und Ausrufezeichen)
\n\n

Alles funktioniert wie erwartet. Aber machen wir die Aufgabe etwas schwieriger:

\n\n
let emojiString = "👨‍👩‍👧‍👦"\nprint(emojiString.count) // 1 (!!!)
\n\n

Eins? Ernsthaft? Und visuell ist das eine ganze Familie von vier Personen. Wo ist der Haken?

\n\n

Die Antwort liegt darin, wie Swift Strings verarbeitet. count zählt keine Bytes und keine einzelnen Unicode-Zeichen, sondern Graphemcluster (extended grapheme clusters). Dies ist eine Sequenz von einem oder mehreren Unicode-Skalaren, die vom Benutzer als ein Zeichen wahrgenommen werden. Das Emoji „Familie“ besteht aus mehreren Teilen, aber Swift zählt es als ein Zeichen, weil der Mensch es so sieht.

\n\n

Dieses Verhalten ist kein Fehler, sondern ein Feature. Swift wurde mit Blick auf Internationalisierung entwickelt. Wenn count jeden Unicode-Skalar zählen würde, könnte der String „café“ (mit einem Zeichen é) je nach Kodierung von é unterschiedliche Ergebnisse liefern: als ein einzelnes Zeichen U+00E9 oder als Kombination von e + Akzent (U+0065 + U+0301).

\n\n
let cafe1 = "café" // é als ein Zeichen\nlet cafe2 = "cafe\\u{0301}" // e + Akzent\nprint(cafe1.count) // 4\nprint(cafe2.count) // 4 (obwohl der String 5 Skalare enthält)
\n\n

Swift zählt beide Varianten als 4 Zeichen, weil der Benutzer „café“ mit 4 Buchstaben sieht. Das ist die Magie der Graphemcluster.

\n\n
\n\n

2. Alternativer Ansatz: NSString und die length-Eigenschaft

\n\n

Manchmal müssen Sie nicht die „menschliche“ Anzahl von Zeichen ermitteln, sondern die Anzahl der UTF-16-Kodierungseinheiten. Zum Beispiel bei der Arbeit mit veralteten APIs, Core Text oder bei der Übertragung von Daten in Formaten, die eine Länge in UTF-16 erwarten (wie einige Netzwerkprotokolle).

\n\n

Hier kommt NSString zur Hilfe – die gute alte Klasse aus Objective-C. Swift-Strings werden automatisch zu NSString gebrückt (bridged), sodass Sie dessen Eigenschaft length verwenden können:

\n\n
let swiftString = "👨‍👩‍👧‍👦"\nlet nsString = swiftString as NSString\nprint(nsString.length) // 11 (Anzahl der UTF-16-Einheiten)
\n\n

Warum 11? Weil das zusammengesetzte Emoji „Familie“ in UTF-16 11 Einheiten belegt (jede Komponente wird durch ein Surrogatpaar oder ein einzelnes Zeichen kodiert). Wenn Sie mit Text arbeiten, der von alten C-Bibliotheken oder APIs verarbeitet wird, die NSString erwarten, verwenden Sie length. Aber denken Sie daran: Dies ist nicht die Anzahl der Zeichen, die der Benutzer sieht.

\n\n

Eine weitere Nuance: NSString berücksichtigt keine Graphemcluster. Für den String „café“ (zweite Variante) gibt length 5 zurück, obwohl count 4 ergibt. Fazit: Wählen Sie die Methode

Blogs

Buchempfehlungen