I ran across this SO post regarding indexing and slicing Strings in Swift, and I added some negative indexing and slicing functionality to the extension.
import Foundation
extension String {
subscript(integerIndex: Int) -> Character {
let index: Index
if integerIndex >= 0 {
index = startIndex.advancedBy(integerIndex)
} else {
index = startIndex.advancedBy(characters.count+integerIndex)
}
return self[index]
}
subscript(integerRange: Range<Int>) -> String {
let start: Index
let end: Index
if integerRange.startIndex >= 0 {
start = startIndex.advancedBy(integerRange.startIndex)
end = startIndex.advancedBy(integerRange.endIndex)
} else {
start = startIndex.advancedBy(characters.count+integerRange.startIndex)
end = startIndex.advancedBy(characters.count+integerRange.endIndex)
}
let range: Range = start..<end
return self[range]
}
}
var s = "Hallo"
s[0]+s[-1] // "Ho"
s[0...2] // "Hal"
s[0...2]+s[1...2] // "Halal"
s[-2 ... -1] // "lo"