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.

3,0

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"
3,0

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"
3,0

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

2.2
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"
3,0
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)

Groß- und Kleinbuchstaben

So machen Sie alle Zeichen in einem String in Groß- oder Kleinbuchstaben:

2.2
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
3,0
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

3,0
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")
}
2.2
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:

3,0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
   print("yes") 
}
else {
   print("no")
}
2.2
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:

3,0
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

2.2
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"
3,0
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

3,0
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() .

3,0

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:

3,0
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.)

3,0
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:

3,0
index = string.startIndex.advanceBy(2)
3,0
currentIndex = string.index(string.startIndex, offsetBy: 2)

Und kann so rückwärts gehen:

3,0
index = string.endIndex.advancedBy(-2)
3,0
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:

3,0
index = string.startIndex.advanceBy(20, limit: string.endIndex)
3,0
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

3,0
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  "
3,0
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

3,0
let data = string.data(using: .utf8)
2.2
let data = string.dataUsingEncoding(NSUTF8StringEncoding)

Data / NSData in String

3,0
let string = String(data: data, encoding: .utf8)
2.2
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:

3,0
let startDate = "23:51"

let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
2.2
let startDate = "23:51"

let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`

Oder wenn das Trennzeichen nicht vorhanden ist:

3,0
let myText = "MyText"

let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
2.2
let myText = "MyText"

let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow