Um das Thema zu füttern und schnelle Subskriptmöglichkeiten zu zeigen, hier noch ein kleiner String "substring-toolbox" im Index
Diese Methoden sind sicher und überschreiten niemals die String-Indizes
extension String {
// string[i] -> ein Zeichen
subscript(pos: Int) -> String { return String(Array(self)[min(self.length-1,max(0,pos))]) }
// string[pos, len] -> Unterstring von pos für len Zeichen auf der linken Seite
subscript(pos: Int, len: Int) -> String { return self[pos, len, .pos_len, .left2right] }
// string[pos, len, .right2left] -> Unterstring von pos für len Zeichen auf der rechten Seite
subscript(pos: Int, len: Int, way: Way) -> String { return self[pos, len, .pos_len, way] }
// string[range] -> Unterstring von Anfangsposition auf der linken Seite bis Endposition auf der rechten Seite
subscript(range: Range) -> String { return self[range.startIndex, range.endIndex, .start_end, .left2right] }
// string[range, .right2left] -> Unterstring von Anfangsposition auf der rechten Seite bis Endposition auf der linken Seite
subscript(range: Range, way: Way) -> String { return self[range.startIndex, range.endIndex, .start_end, way] }
var length: Int { return countElements(self) }
enum Mode { case pos_len, start_end }
enum Way { case left2right, right2left }
subscript(var val1: Int, var val2: Int, mode: Mode, way: Way) -> String {
if mode == .start_end {
if val1 > val2 { let val=val1 ; val1=val2 ; val2=val }
val2 = val2-val1
}
if way == .left2right {
val1 = min(self.length-1, max(0,val1))
val2 = min(self.length-val1, max(1,val2))
} else {
let val1_ = val1
val1 = min(self.length-1, max(0, self.length-val1_-val2 ))
val2 = max(1, (self.length-1-val1_)-(val1-1) )
}
return self.bridgeToObjectiveC().substringWithRange(NSMakeRange(val1, val2))
//-- Alternativer Code ohne bridge --
//var range: Range = pos...(pos+len-1)
//var start = advance(startIndex, range.startIndex)
//var end = advance(startIndex, range.endIndex)
//return self.substringWithRange(Range(start: start, end: end))
}
}
println("0123456789"[3]) // gibt "3" zurück
println("0123456789"[3,2]) // gibt "34" zurück
println("0123456789"[3,2,.right2left]) // gibt "56" zurück
println("0123456789"[5,10,.pos_len,.left2right]) // gibt "56789" zurück
println("0123456789"[8,120,.pos_len,.right2left]) // gibt "01" zurück
println("0123456789"[120,120,.pos_len,.left2right]) // gibt "9" zurück
println("0123456789"[0...4]) // gibt "01234" zurück
println("0123456789"[0..4]) // gibt "0123" zurück
println("0123456789"[0...4,.right2left]) // gibt "56789" zurück
println("0123456789"[4...0,.right2left]) // gibt "678" zurück << weil ??? Bereich kann EndIndex von 0 haben ???