Einleitung: Die "Falle", die jeden Swift-Entwickler erwartet
\n\nStell dir vor: Du schreibst selbstbewusst Code in Swift, alles läuft rund, und dann musst du die ersten drei Zeichen aus einem String holen. Du schreibst, ohne nachzudenken, so etwas wie myString[0..<3] – und erhältst... einen Kompilierungsfehler. Kommt dir bekannt vor?
Willkommen in der Welt von String substring in Swift. Das ist eines dieser Themen, das Anfängern und sogar erfahrenen Entwicklern, die von anderen Sprachen wechseln, echte Kopfschmerzen bereitet. Die Frage "How does String substring work in Swift" hat auf Stack Overflow tausende Aufrufe – und das nicht ohne Grund.
\n\nIn diesem Artikel werden wir analysieren, warum Swift so "seltsam" bei der Arbeit mit Teilstrings ist, wie man substring in Swift richtig verwendet und welche neuen Möglichkeiten in den letzten Versionen hinzugekommen sind. Los geht's!
\n\nWarum erlaubt Swift nicht einfach, ein Stück eines Strings herauszuschneiden?
\n\nIn den meisten Sprachen (Python, JavaScript, C#) ist ein String einfach ein Array von Zeichen. Du willst einen Teilstring? Schreibe str[0:3] und erhalte das Ergebnis. In Swift ist alles anders.
Der Grund liegt in der Arbeit mit Unicode. Strings in Swift sind nicht einfach Bytes oder ASCII-Zeichen. Sie bestehen aus Graphem-Clustern (grapheme clusters). Ein einzelnes Zeichen, das der Benutzer sieht (z.B. "é" oder "👍🏽"), kann mehrere Character oder sogar mehrere Unicode.Scalar belegen. Stell dir vor, du schneidest einen String mitten in einem solchen Cluster ab – du erhältst beschädigte Daten.
Deshalb verwendet Swift Indizes (String.Index) anstelle von ganzen Zahlen. Dies stellt sicher, dass du niemals ein Zeichen in der Mitte durchtrennst.
Grundlagen: String.Index und einfaches Extrahieren eines Teilstrings
\n\nBeginnen wir mit einem einfachen Beispiel. Angenommen, wir haben einen String:
\n\nlet fullString = "Привет, Swift!"\n// Wir wollen das Wort "Swift" nehmen\nlet startIndex = fullString.index(fullString.startIndex, offsetBy: 8)\nlet endIndex = fullString.index(fullString.startIndex, offsetBy: 13)\nlet substring = fullString[startIndex..<endIndex]\nprint(substring) // Gibt aus: "Swift"\n\nBeachte: substring hat den Typ Substring, nicht String. Das ist ein wichtiger Unterschied. Substring ist ein "Fenster" in den ursprünglichen String. Es kopiert keine Daten, sondern verweist lediglich auf einen Teil des Speichers des ursprünglichen Strings. Das ist super effizient, kann aber zu Speicherlecks führen, wenn der ursprüngliche String groß und der Teilstring klein ist.
Um einen Substring in einen vollwertigen String umzuwandeln, verwende einfach den Initialisierer:
let newString = String(substring)\nprint(newString) // "Swift"\n\nSyntaktischer Zucker: RangeExpression
\n\nJedes Mal index(offsetBy:) zu schreiben, ist mühsam. Glücklicherweise erlaubt Swift kürzere Formen mit RangeExpression.
Der Operator ... (ClosedRange)
\nlet str = "Hello, World!"\nif let range = str.range(of: "World") {\n let worldSubstring = str[range]\n print(worldSubstring) // "World"\n}\n\nPartielle Bereiche (Partial Range)
\nDu willst alles bis zu einem bestimmten Index oder danach nehmen? Einfach:
\nlet text = "Swift Programming"\nlet prefix = text[..<text.index(text.startIndex, offsetBy: 5)]\nprint(prefix) // "Swift"\n\nlet suffix = text[text.index(text.startIndex, offsetBy: 6)...]\nprint(suffix) // "Programming"\n\nBeachte: prefix und suffix sind ebenfalls Substring.
Eingebaute Methoden: prefix, suffix, dropFirst, dropLast
\n\nSwift bietet praktische Methoden, die die manuelle Berechnung von Indizes überflüssig machen. Sie geben Substring zurück.
- \n
str.prefix(5)– die ersten 5 Zeichen. \n str.suffix(3)– die letzten 3 Zeichen.Blogs
Buchempfehlungen
Lesen Sie auch
Wie man Dokumentation für ein C#-Projekt schreibt: Best Practices und Beispiele
OAuth 2.0 und JWT-Autorisierung in TypeScript: vollständiger Leitfaden
Mikroservices mit Go: Architektur und Praxis von A bis Z
Logging in Go-Anwendungen: Best Practices und Tools
Var_dump in String umwandeln: 5 Fehler, die PHP-Debugging ruinieren