Eigentlich ist es ja eine einfache Übung, von einem String einen Substring zu ermitteln. Wer vorher jedoch nicht schon mit Objective-C entwickelt hat, wird bei Swift an dieser Stelle vielleicht kurz ins Stocken kommen und vergeblich eine Methode substring oder ähnliches suchen. Substring werden in Swift nämlich so gebildet:
1 2 3 |
var str = "Hello, playground" let str1 = str[advance(str.startIndex, 7)..<str.endIndex] println(str1) // gibt »playground« aus |
Als Parameter wird hier eine Range mit einem startIndex und endIndex erwartet. Mit der Hilfsfunktion advance können wir eine Range erweitern oder auch verringern:
1 2 3 |
var str = "Hello, playground" let str1 = str[str.startIndex..<advance(str.endIndex, -12)] println(str1) // gibt »Hello« aus |
Etwas verwunderlich ist, dass wir für den Bereich nicht direkt einen Int-Wert angeben können. Um das zu erreichen, müssen wir das String-Objekt selbst erweitern und „Integer-fähig“ machen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
extension String { subscript(i: Int) -> Character { return self[advance(startIndex, i)] } subscript(range: Range<Int>) -> String { return self[advance(startIndex, range.startIndex)..<advance(startIndex, range.endIndex)] } } var str = "Hello, playground" let str1 = str[7..<11] println(str1) // gibt »play« aus |
Alternativ können wir uns natürlich auch eine einfache substring-Methode erstellen, die Integer-Werte akzeptiert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
extension String { func substring(fromPos start: Int, withLength length: Int) -> String { if length > 0 { return self[advance(self.startIndex, start)..<advance(self.startIndex, start+length)] } else { return self[advance(self.startIndex, start+length)..<advance(self.startIndex, start)] } } } var str = "Hello, playground" let str1 = str.substring(fromPos: 7, withLength: 4) println(str1) // gibt »play« aus let str2 = str.substring(fromPos: 5, withLength: -5) println(str2) // gibt »Hello« aus |
Schwer ist das alles also nicht, für manchen jedoch sicherlich anfangs erst mal ungewohnt.