Strings in Swift 4

article header

Aktualisiert am 24. Oktober 2017


Für Zeichenketten (Strings) gibt es in Swift den Datentyp String.


let myString: String = "Hello World!"

Die Zeichen werden in doppelte Anführungszeichen gesetzt. Die Verwendung des Schlüsselwortes String ist nicht zwangsläufig erforderlich. Swift versucht dann automatisch den richtigen Datentyp zu ermitteln (type inference).

String und Character

Es handelt sich bei einem String um eine Sammlung von einzelnen Zeichen (Characters). Character ist übrigens ebenfalls ein Datentyp in Swift. Möchte man anstelle eines String-Typs einen Character-Typ deklarieren, muss dies explizit angegeben werden. Einzelne Zeichen werden hierbei ebenfalls in doppelte Anführungszeichen gesetzt.


let myString = "Hello World!" // String
let myCharacter: Character = "A" // Character

Ein String kann aus einem “Character-Array” erzeugt werden:


let myCharacterArray: [Character] = ["w", "o", "r", "d"]
let myString = String(myCharacterArray)
print(myString) // -> "word"

Leere Strings erzeugen

Für die Erzeugung eines leeren Strings existieren in Swift zwei Möglichkeiten. Zum einen kann einfach ein leeres String-Literal verwendet werden:


var myString = ""

Zum anderen kann ein parameterloser String erzeugt werden (initializer syntax):

var myString = String()

Ob ein leerer String vorliegt, kann mit isEmpty ermittelt werden:

if myString.isEmpty {
    // do something
}

Länge einer Zeichenkette ermitteln

Es gibt in Swift für den Datentyp String keine length-Eigenschaft. Soll die Länge einer Zeichenkette ermittelt werden, kann dies mit count durchgeführt werden. Im Gegensatz zu Swift 3 muss dabei nicht mehr auf character zurückgegriffen werden.


let myString = "Bochum"
print(myString.count) // -> 6

Strings zusammensetzen

Verschiedene Strings können mit dem +-Operator oder +=-Operator zu einem String zusammengesetzt werden:


var myString = "Hello "
myString += "World"
print(myString) // Hello World

Im Beispiel ist das Schlüsselwort var vorangestellt. Wird stattdessen let verwendet, dann ist die Variable “myString” nicht veränderbar; “myString” wäre dann eine Konstante.

Strings vergleichen

Strings können durch == und != miteinander verglichen werden.


var firstString = "Hello World"
var secondString = "Hello World"
var comparison = (firstString == secondString) // -> true

String Interpolation

In Swift können Werte auf einfache Weise in Strings umgewandelt werden:


var age = 32
print("Sein Alter beträgt \(age) Jahre.")
// -> Sein Alter beträgt 32 Jahre.

Dieser Vorgang wird als Interpolation bezeichnet. Darunter versteht man die Erzeugung eines (neuen) Strings aus Variablen oder Konstanten, indem deren Werte in ein String-Literal eingefügt werden. Im obigen Beispiel wurde die Variable age in so ein Literal integriert. Die Variable muss dabei in Klammern einem Backslash folgen, hier also \(age).

Formatierte Strings

So einfach die Umwandlung in eine Zeichenkette mit der String Interpolation auch ist, es gibt Fälle, in denen man sich mehr Einfluss auf das Ausgabeformat wünscht. Hier helfen format strings weiter. Anstelle von


var weight = 86.17
weightLabel.text = "\(weight)"

könnte man auch

weightLabel.text = String(format: "%.1f", weight)
// -> 86.2

schreiben.

In dem Code wird an die Stelle des durch ein %-Zeichen gekennzeichneten Platzhalters der (formatierte) Wert der Variable weight eingesetzt.

Platzhalter beginnen immer mit einem Prozentzeichen, gefolgt von der Angabe des Typs:

  • %f steht für eine Dezimalzahl
  • %d steht für Werte vom Typ Integer
  • %@ steht für Objekte

Im obigen Beispiel wird %.1f verwendet, also ein Dezimalzahl-Platzhalter, wobei die 1 kennzeichnet, dass nur eine Nachkommastelle angezeigt werden soll.

Iteration

Über die einzelnen Zeichen eines Strings kann mit der Methode index(_:offsetBy:) iteriert werden:


let myString = "hello"
let x = myString.index(myString.startIndex, offsetBy: 1)
myString[x]
// -> e

Ergänzt um den Parameter limitedBy wird nil zurückgegeben, sobald das Ende der Zeichenkette, nicht aber der Index erreicht wurde.


let myString = "hello"
let x = myString.index(myString.startIndex, offsetBy: 100, limitedBy: myString.endIndex)
// -> nil

String vs. NSString

In Objective-C wurde für eine Zeichenkette ein NSString-Objekt verwendet. NSString ist auch in Swift verfügbar und kann anstelle von String genutzt werden. Möchte man den Datentyp NSString verwenden, muss dies expliziert deklariert werden:

let text: NSString = "Hello World!"

Im Gegensatz zu NSString, das als Klasse implementiert ist, handelt es sich bei Strings um Strukturen. Dies stellt eine nicht unerhebliche Abweichung des bisherigen Konzepts dar, denn wenn eine String-Zeichenkette einer neuen Variable zugewiesen wird, wird sie kopiert. Eine Änderung der ursprünglichen Zeichenkette würde also keinen Einfluss auf die Kopie haben. Die Zuweisung einer NSString-Zeichenkette zu einer neuen Variable löst hingegen keinen Kopiervorgang aus. Vielmehr hat die neue Variable eine Referenz auf die bisherige Zeichenkette. Mit anderen Worten: Beide Variablen zeigen auf die gleiche Zeichenkette.