각 String 값은 문자열에 각 Character의 위치에 해당하는 String.Index인 인덱스 타입을 가지고 있다.
위에서 언급했듯이 문자마다 저장할 메모리 양이 다를 수 있으므로 특정 위치에 있는 Character를 확인하려면 해당 String의 시작 또는 끝에서 각 유니코드 스칼라를 반복해야 한다. 이러한 이유로 Swift 문자열은 정수값으로 인덱스를 생성할 수 없다.
String의 첫번째 Character에 접근하기 위해 startIndex 프로퍼티를 사용한다.
endIndex 프로퍼티는 String 마지막 문자의 다음 위치이다.
그러므로 endIndex 프로퍼티는 문자열의 서브스크립트에 유효한 인수가 아니다.
String이 비어있다면 startIndex와 endIndex는 같다.
String의 메소드 index(before:)와 index(after:)를 사용하여 주어진 인덱스의 전과 후에 접근할 수 있다.
주어진 인덱스에서 먼 인덱스에 접근하려면 이러한 메소드를 여러 번 호출하는 대신 index(_:offsetBy:) 메소드를 사용할 수 있다.
특정 String 인덱스의 Character에 접근하기 위해 서브스크립트 구문을 사용할 수 있다.
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
문자열 범위에 벗어나는 인덱스로 접근하거나 문자열 범위에 벗어나는 인덱스의 Character 를 접근하려고 하면 런타임 에러가 발생한다.
greeting[greeting.endIndex] // Error
greeting.index(after: greeting.endIndex) // Error
indices 프로퍼티를 사용하여 문자열에 있는 개별 문자의 모든 인덱스에 접근한다.
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n T a g ! "
Note:
Collection 프로토콜을 준수하는 어떠한 타입에서든 startIndex와 endIndex 프로퍼티와 index(before:), index(after:), 그리고 index(_:offsetBy:) 메소드를 사용할 수 있다. 이것은 여기서 봤듯이 String 뿐만 아니라 Array, Dictionary, 그리고 Set과 같은 콜렉션 타입도 포함된다.
문자열 특정 인덱스에 하나의 문자를 삽입하려면 insert(_:at:) 메소드를 사용하고 다른 문자열의 콘텐츠를 특정 인덱스에 삽입하려면 insert(contentsOf:at:) 메소드를 사용한다.
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
문자열에 특정 인덱스에 있는 하나의 문자를 삭제하려면 remove(at:) 메소드를 사용하고,
특정 범위의 부분 문자열을 삭제하려면 removeSubrange(_:) 메소드를 사용한다.
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"
Note:
RangeReplaceableCollection 프로토콜을 준수하는 어떠한 타입에서든 insert(:at:), insert(contentOf:at:), remove(at:) 그리고 removeSubrange(:) 메소드를 사용할 수 있다.