Swift Language
Zeichenketten und Zeichen
Suche…
Syntax
- String.characters // Gibt ein Array der Zeichen in der Zeichenfolge zurück
- String.characters.count // Liefert die Anzahl der Zeichen
- String.utf8 // Eine String.UTF8View gibt die UTF-8-Zeichenpunkte in der Zeichenfolge zurück
- String.utf16 // Eine String.UTF16View gibt die UTF-16-Zeichenpunkte in der Zeichenfolge zurück
- String.unicodeScalars // Eine String.UnicodeScalarView gibt die UTF-32-Zeichenpunkte in der Zeichenfolge zurück
- String.isEmpty // Gibt "true" zurück, wenn der String keinen Text enthält
- String.hasPrefix (String) // Gibt "true" zurück, wenn dem Argument das Argument vorangestellt ist
- String.hasSuffix (String) // Gibt "true" zurück, wenn der String das Argument enthält
- String.startIndex // Gibt den Index zurück, der dem ersten Zeichen in der Zeichenfolge entspricht
- String.endIndex // Gibt den Index zurück, der der Stelle hinter dem letzten Zeichen in der Zeichenfolge entspricht
- String.components (separatesBy: String) // Gibt ein Array zurück, das die durch die angegebene Trennzeichenfolge getrennten Teilzeichenfolgen enthält
- String.append (Character) // Fügt das Zeichen (als Argument angegeben) zum String hinzu
Bemerkungen
Ein String
in Swift ist eine Sammlung von Zeichen und in der Erweiterung eine Sammlung von Unicode-Skalaren. Da Swift Strings auf Unicode basieren, können sie beliebige Unicode-Skalarwerte sein, einschließlich anderer Sprachen als Englisch und Emojis.
Da zwei Skalare zu einem einzelnen Zeichen kombiniert werden können, entspricht die Anzahl der Skalare in einem String nicht unbedingt immer der Anzahl der Zeichen.
Weitere Informationen zu Strings finden Sie unter Die Swift-Programmiersprache und die String-Strukturreferenz .
Einzelheiten zur Implementierung finden Sie unter "Swift String Design".
String & Character Literals
String- Literale in Swift werden durch Anführungszeichen ( "
) getrennt:
let greeting = "Hello!" // greeting's type is String
Zeichen können aus String-Literalen initialisiert werden, solange das Literal nur einen Graphem-Cluster enthält:
let chr: Character = "H" // valid
let chr2: Character = "😊" // valid
let chr3: Character = "abc" // invalid - multiple grapheme clusters
String Interpolation
Die String-Interpolation ermöglicht das direkte Einfügen eines Ausdrucks in ein String-Literal. Dies kann mit allen Arten von Werten durchgeführt werden, einschließlich Zeichenfolgen, Ganzzahlen, Gleitkommazahlen und mehr.
Die Syntax ist ein Backslash, gefolgt von Klammern, die den Wert umschließen: \(value)
. Jeder gültige Ausdruck kann in Klammern angezeigt werden, einschließlich Funktionsaufrufen.
let number = 5
let interpolatedNumber = "\(number)" // string is "5"
let fortyTwo = "\(6 * 7)" // string is "42"
let example = "This post has \(number) view\(number == 1 ? "" : "s")"
// It will output "This post has 5 views" for the above example.
// If the variable number had the value 1, it would output "This post has 1 view" instead.
Bei benutzerdefinierten Typen lautet das Standardverhalten der Zeichenfolgeninterpolation, dass "\(myobj)"
gleichbedeutend mit String(myobj)
, der gleichen Darstellung, die von print(myobj)
. Sie können dieses Verhalten anpassen, indem Sie das CustomStringConvertible
Protokoll für Ihren Typ implementieren.
Für Swift 3 wurde gemäß SE-0089 String.init<T>(_:)
in String.init<T>(describing:)
.
Bei der Zeichenketteninterpolation "\(myobj)"
wird der neue String.init<T: LosslessStringConvertible>(_:)
vorgezogen, er wird jedoch auf init<T>(describing:)
wenn der Wert nicht LosslessStringConvertible
.
Spezielle Charaktere
Bestimmte Zeichen erfordern eine spezielle Escape-Sequenz , um sie in String-Literalen verwenden zu können:
Charakter | Bedeutung |
---|---|
\0 | das Nullzeichen |
\\ | ein einfacher Backslash, \ |
\t | ein Tabulatorzeichen |
\v | eine vertikale Registerkarte |
\r | ein Wagenrücklauf |
\n | ein Zeilenvorschub ("Newline") |
\" | ein doppeltes Zitat " |
\' | ein einziges Zitat, ' |
\u{n} | der Unicode-Codepunkt n (hexadezimal) |
Beispiel:
let message = "Then he said, \"I \u{1F496} you!\""
print(message) // Then he said, "I 💖 you!"
Zeichenketten verketten
Verketten Sie Zeichenfolgen mit dem Operator +
, um eine neue Zeichenfolge zu erzeugen:
let name = "John"
let surname = "Appleseed"
let fullName = name + " " + surname // fullName is "John Appleseed"
An eine veränderliche Zeichenfolge mithilfe des zusammengesetzten Zuweisungsoperators +=
oder mithilfe einer Methode anhängen:
let str2 = "there"
var instruction = "look over"
instruction += " " + str2 // instruction is now "look over there"
var instruction = "look over"
instruction.append(" " + str2) // instruction is now "look over there"
Hängen Sie ein einzelnes Zeichen an einen veränderbaren String an:
var greeting: String = "Hello"
let exclamationMark: Character = "!"
greeting.append(exclamationMark)
// produces a modified String (greeting) = "Hello!"
Hängen Sie mehrere Zeichen an einen veränderbaren String an
var alphabet:String = "my ABCs: "
alphabet.append(contentsOf: (0x61...0x7A).map(UnicodeScalar.init)
.map(Character.init) )
// produces a modified string (alphabet) = "my ABCs: abcdefghijklmnopqrstuvwxyz"
appendContentsOf(_:)
wurde in append(_:)
.
joinWithSeparator(_:)
Sie eine Folge von Zeichenfolgen, um mithilfe von joinWithSeparator(_:)
eine neue Zeichenfolge zu bilden:
let words = ["apple", "orange", "banana"]
let str = words.joinWithSeparator(" & ")
print(str) // "apple & orange & banana"
joinWithSeparator(_:)
wurde in joinWithSeparator(_:)
joined(separator:)
.
Das separator
ist standardmäßig der leere String, also ["a", "b", "c"].joined() == "abc"
.
Strings untersuchen und vergleichen
Prüfen Sie, ob eine Zeichenfolge leer ist:
if str.isEmpty {
// do something if the string is empty
}
// If the string is empty, replace it with a fallback:
let result = str.isEmpty ? "fallback string" : str
Prüfen Sie, ob zwei Zeichenfolgen gleich sind (im Sinne einer kanonischen Unicode-Äquivalenz ):
"abc" == "def" // false
"abc" == "ABC" // false
"abc" == "abc" // true
// "LATIN SMALL LETTER A WITH ACUTE" == "LATIN SMALL LETTER A" + "COMBINING ACUTE ACCENT"
"\u{e1}" == "a\u{301}" // true
Prüfen Sie, ob eine Zeichenfolge mit einer anderen Zeichenfolge beginnt oder endet:
"fortitude".hasPrefix("fort") // true
"Swift Language".hasSuffix("age") // true
String-Codierung und -Zerlegung
Ein Swift- String besteht aus Unicode- Codepunkten. Es kann auf verschiedene Arten zerlegt und codiert werden.
let str = "ที่👌①!"
Zeichenketten zerlegen
Die characters
einer Zeichenfolge sind erweiterte Unicode- Graphem-Cluster :
Array(str.characters) // ["ที่", "👌", "①", "!"]
Die unicodeScalars
sind die Unicode- Codepunkte , aus denen eine Zeichenfolge besteht (beachten Sie, dass ที่
ein Graphem-Cluster ist, aber 3 Codepunkte - 3607, 3637, 3656 -, so dass die Länge des resultierenden Arrays nicht der von characters
str.unicodeScalars.map{ $0.value } // [3607, 3637, 3656, 128076, 9312, 33]
Sie können Strings als UTF-8 (eine Folge von UInt8
s) oder UTF-16 (eine Folge von UInt16
s) kodieren und zerlegen:
Array(str.utf8) // [224, 184, 151, 224, 184, 181, 224, 185, 136, 240, 159, 145, 140, 226, 145, 160, 33]
Array(str.utf16) // [3607, 3637, 3656, 55357, 56396, 9312, 33]
Stringlänge und Iteration
Die characters
einer Zeichenfolge, unicodeScalars
, utf8
und utf16
sind alle Collection - characters
Sie können also deren count
und sie durchlaufen:
// NOTE: These operations are NOT necessarily fast/cheap!
str.characters.count // 4
str.unicodeScalars.count // 6
str.utf8.count // 17
str.utf16.count // 7
for c in str.characters { // ...
for u in str.unicodeScalars { // ...
for byte in str.utf8 { // ...
for byte in str.utf16 { // ...
Unicode
Einstellwerte
Verwenden Sie Unicode direkt
var str: String = "I want to visit 北京, Москва, मुंबई, القاهرة, and 서울시. 😊"
var character: Character = "🌍"
Verwenden von Hexadezimalwerten
var str: String = "\u{61}\u{5927}\u{1F34E}\u{3C0}" // a大🍎π
var character: Character = "\u{65}\u{301}" // é = "e" + accent mark
Beachten Sie, dass das Swift- Character
aus mehreren Unicode-Codepunkten bestehen kann, aber ein einziges Zeichen zu sein scheint. Dies wird als Extended Grapheme Cluster bezeichnet.
Konvertierungen
String -> Hex
// Accesses views of different Unicode encodings of `str`
str.utf8
str.utf16
str.unicodeScalars // UTF-32
Hex -> String
let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E
let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)) // 大
let string2 = String(UnicodeScalar(value2)) // 🍎
// convert hex array to String
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array
var myString = ""
for hexValue in myHexArray {
myString.append(UnicodeScalar(hexValue))
}
print(myString) // Cat‼🐱
Beachten Sie, dass die Konvertierung für UTF-8 und UTF-16 nicht immer so einfach ist, da beispielsweise Emoji nicht mit einem einzigen UTF-16-Wert codiert werden kann. Es braucht ein Ersatzpaar.
Strings umkehren
let aString = "This is a test string."
// first, reverse the String's characters
let reversedCharacters = aString.characters.reverse()
// then convert back to a String with the String() initializer
let reversedString = String(reversedCharacters)
print(reversedString) // ".gnirts tset a si sihT"
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)
Groß- und Kleinbuchstaben
So machen Sie alle Zeichen in einem String in Groß- oder Kleinbuchstaben:
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
let text = "AaBbCc"
let uppercase = text.uppercased() // "AABBCC"
let lowercase = text.lowercased() // "aabbcc"
Prüfen Sie, ob String Zeichen aus einem definierten Satz enthält
Briefe
let letters = CharacterSet.letters
let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: letters)
// range will be nil if no letters is found
if let test = range {
print("letters found")
}
else {
print("letters not found")
}
let letters = NSCharacterSet.letterCharacterSet()
let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(letters)
// range will be nil if no letters is found
if let test = range {
print("letters found")
}
else {
print("letters not found")
}
Die neue CharacterSet
Struktur, die auch mit der Objective-C-Klasse NSCharacterSet
, definiert mehrere vordefinierte Mengen als:
-
decimalDigits
-
capitalizedLetters
-
alphanumerics
-
controlCharacters
-
illegalCharacters
- und mehr finden Sie in der NSCharacterSet- Referenz.
Sie können auch Ihren eigenen Zeichensatz definieren:
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")
if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
print("yes")
}
else {
print("no")
}
let charset = NSCharacterSet(charactersInString: "t")
if let _ = phrase.rangeOfCharacterFromSet(charset, options: .CaseInsensitiveSearch, range: nil) {
print("yes")
}
else {
print("no")
}
Sie können auch Bereich hinzufügen:
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")
if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive, range: phrase.startIndex..<phrase.endIndex)) {
print("yes")
}
else {
print("no")
}
Zählen Sie Vorkommen eines Zeichens in einen String
Bei einem String
und einen Character
let text = "Hello World"
let char: Character = "o"
Wir können die zählen , wie oft das Character
erscheint in den String
mit
let sensitiveCount = text.characters.filter { $0 == char }.count // case-sensitive
let insensitiveCount = text.lowercaseString.characters.filter { $0 == Character(String(char).lowercaseString) } // case-insensitive
Entfernen Sie Zeichen aus einer Zeichenfolge, die nicht in Set definiert ist
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
return String(text.characters.filter { set.contains( $0) })
}
let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text, set: chars) // "SwiftComeOut"
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
return String(text.characters.filter { set.contains( $0) })
}
let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text: text, set: chars)
Zeichenketten formatieren
Führende Nullen
let number: Int = 7
let str1 = String(format: "%03d", number) // 007
let str2 = String(format: "%05d", number) // 00007
Zahlen nach Dezimalzahl
let number: Float = 3.14159
let str1 = String(format: "%.2f", number) // 3.14
let str2 = String(format: "%.4f", number) // 3.1416 (rounded)
Dezimal bis Hexadezimal
let number: Int = 13627
let str1 = String(format: "%2X", number) // 353B
let str2 = String(format: "%2x", number) // 353b (notice the lowercase b)
Alternativ kann man einen spezialisierten Initialisierer verwenden, der dasselbe tut:
let number: Int = 13627
let str1 = String(number, radix: 16, uppercase: true) //353B
let str2 = String(number, radix: 16) // 353b
Dezimal auf eine Zahl mit beliebiger Basis
let number: Int = 13627
let str1 = String(number, radix: 36) // aij
Radix ist in [2, 36]
Int
.
Konvertieren einer Swift-Zeichenfolge in einen Zahlentyp
Int("123") // Returns 123 of Int type
Int("abcd") // Returns nil
Int("10") // Returns 10 of Int type
Int("10", radix: 2) // Returns 2 of Int type
Double("1.5") // Returns 1.5 of Double type
Double("abcd") // Returns nil
Beachten Sie, dass dies einen Optional
Wert zurückgibt, der vor der Verwendung entsprechend entpackt werden sollte.
Zeichenfolge-Iteration
let string = "My fantastic string"
var index = string.startIndex
while index != string.endIndex {
print(string[index])
index = index.successor()
}
Hinweis: endIndex
steht hinter dem Ende der Zeichenfolge (dh string[string.endIndex]
ist ein Fehler, string[string.startIndex]
ist jedoch in Ordnung). In einer leeren Zeichenfolge ( ""
) ist string.startIndex == string.endIndex
true
. startIndex.successor()
Sie sicher, dass Sie nach leeren Zeichenfolgen startIndex.successor()
, da Sie startIndex.successor()
für eine leere Zeichenfolge aufrufen startIndex.successor()
.
In Swift 3 haben String-Indizes keinen successor()
, predecessor()
, advancedBy(_:)
, advancedBy(_:limit:)
oder distanceTo(_:)
.
Stattdessen werden diese Vorgänge in die Collection verschoben, die nun für das Inkrementieren und Dekrementieren ihrer Indizes verantwortlich ist.
Verfügbare Methoden sind .index(after:)
, .index(before:)
und .index(_:, offsetBy:)
.
let string = "My fantastic string"
var currentIndex = string.startIndex
while currentIndex != string.endIndex {
print(string[currentIndex])
currentIndex = string.index(after: currentIndex)
}
Hinweis: Wir verwenden currentIndex
als Variablennamen, um Verwechslungen mit der .index
Methode zu vermeiden.
Und zum Beispiel, wenn Sie den anderen Weg gehen wollen:
var index:String.Index? = string.endIndex.predecessor()
while index != nil {
print(string[index!])
if index != string.startIndex {
index = index.predecessor()
}
else {
index = nil
}
}
(Oder Sie könnten die Zeichenfolge zuerst umkehren, aber wenn Sie nicht die gesamte Zeichenfolge durchlaufen müssen, würden Sie wahrscheinlich eine solche Methode bevorzugen.)
var currentIndex: String.Index? = string.index(before: string.endIndex)
while currentIndex != nil {
print(string[currentIndex!])
if currentIndex != string.startIndex {
currentIndex = string.index(before: currentIndex!)
}
else {
currentIndex = nil
}
}
Hinweis: Index
ist ein Objekttyp und kein Int
. Sie können auf ein Zeichenzeichenfolge nicht wie folgt zugreifen:
let string = "My string"
string[2] // can't do this
string.characters[2] // and also can't do this
Sie können jedoch einen bestimmten Index wie folgt erhalten:
index = string.startIndex.advanceBy(2)
currentIndex = string.index(string.startIndex, offsetBy: 2)
Und kann so rückwärts gehen:
index = string.endIndex.advancedBy(-2)
currentIndex = string.index(string.endIndex, offsetBy: -2)
Wenn Sie die Grenzen der Zeichenfolge überschreiten oder einen Grenzwert angeben möchten, können Sie Folgendes verwenden:
index = string.startIndex.advanceBy(20, limit: string.endIndex)
currentIndex = string.index(string.startIndex, offsetBy: 20, limitedBy: string.endIndex)
Alternativ können Sie einfach die Zeichen in einer Zeichenfolge durchlaufen, dies kann jedoch je nach Kontext weniger nützlich sein:
for c in string.characters {
print(c)
}
Entfernen Sie den führenden und folgenden WhiteSpace und NewLine
let someString = " Swift Language \n"
let trimmedString = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
// "Swift Language"
Die Methode stringByTrimmingCharactersInSet
gibt eine neue Zeichenfolge zurück, die durch Entfernen der beiden Zeichenfolgen in einem bestimmten Zeichensatz von beiden Enden erstellt wird.
Wir können auch nur Whitespace oder Newline entfernen.
Nur Leerzeichen entfernen:
let trimmedWhiteSpace = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// "Swift Language \n"
Nur Newline entfernen:
let trimmedNewLine = someString.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
// " Swift Language "
let someString = " Swift Language \n"
let trimmedString = someString.trimmingCharacters(in: .whitespacesAndNewlines)
// "Swift Language"
let trimmedWhiteSpace = someString.trimmingCharacters(in: .whitespaces)
// "Swift Language \n"
let trimmedNewLine = someString.trimmingCharacters(in: .newlines)
// " Swift Language "
Hinweis: Alle diese Methoden gehören zu Foundation
. Verwenden Sie import Foundation
wenn Foundation nicht bereits über andere Bibliotheken wie Cocoa oder UIKit importiert wird.
Konvertieren Sie String in und aus Daten / NSData
Um String in und aus Data / NSData zu konvertieren, müssen wir diesen String mit einer bestimmten Codierung codieren. Das bekannteste ist UTF-8
, eine 8-Bit-Darstellung von Unicode-Zeichen, die zur Übertragung oder Speicherung von ASCII-basierten Systemen geeignet ist. Hier ist eine Liste aller verfügbaren String Encodings
String
zu Data
/ NSData
let data = string.data(using: .utf8)
let data = string.dataUsingEncoding(NSUTF8StringEncoding)
Data
/ NSData
in String
let string = String(data: data, encoding: .utf8)
let string = String(data: data, encoding: NSUTF8StringEncoding)
Einen String in ein Array aufteilen
In Swift können Sie einen String leicht in ein Array unterteilen, indem Sie ihn nach einem bestimmten Zeichen schneiden:
let startDate = "23:51"
let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
let startDate = "23:51"
let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`
Oder wenn das Trennzeichen nicht vorhanden ist:
let myText = "MyText"
let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
let myText = "MyText"
let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]