다음 예제는 모두
var str = "Hello, playground"
startIndex
과 endIndex
startIndex
첫 번째 문자의 색인입니다.
endIndex
마지막 문자 뒤 의 색인 입니다.
예
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Swift 4의 단측 범위 를 사용하면 범위를 다음 형식 중 하나로 단순화 할 수 있습니다.
let range = str.startIndex...
let range = ..<str.endIndex
명확성을 위해 다음 예제에서는 전체 형식을 사용하지만 가독성을 위해 코드에서 단측 범위를 사용하는 것이 좋습니다.
after
에서와 같이 : index(after: String.Index)
after
주어진 색인 바로 뒤의 문자 색인을 참조합니다.
예
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
에서와 같이 : index(before: String.Index)
before
주어진 색인 바로 앞의 문자 색인을 참조합니다.
예
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
에서와 같이 : index(String.Index, offsetBy: String.IndexDistance)
offsetBy
값은 주어진 인덱스에서 긍정적 또는 부정적 개시 될 수있다. 그것은 유형이지만 String.IndexDistance
, 당신은 그것에게를 제공 할 수 있습니다 Int
.
예
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
에서와 같이 : index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- 는
limitedBy
반드시 오프셋 인덱스가 범위의 외출이 발생하지 않음을 만들기위한 유용합니다. 경계 인덱스입니다. 오프셋이 제한을 초과 할 수 있으므로이 메서드는 Optional을 반환합니다. nil
인덱스가 범위를 벗어난 경우 반환 됩니다.
예
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
있었다 오프셋 경우 77
대신 7
다음 if
문을했을 것이다 건너 뜁니다.
String.Index가 필요한 이유는 무엇입니까?
문자열에 대한 색인 을 사용하는 것이 훨씬 쉬울 것 Int
입니다. String.Index
모든 문자열에 대해 새 문자열 을 만들어야하는 이유 는 Swift의 문자가 후드 아래에서 모두 같은 길이가 아니기 때문입니다. 단일 Swift 문자는 하나, 둘 또는 그 이상의 유니 코드 코드 포인트로 구성 될 수 있습니다. 따라서 각각의 고유 한 문자열은 해당 문자의 인덱스를 계산해야합니다.
Int 인덱스 확장 뒤에 이러한 복잡성을 숨기는 것이 가능하지만 그렇게하는 것을 꺼려합니다. 실제로 일어나고있는 일을 상기시키는 것이 좋습니다.
startIndex
0이 아닌 다른 이유는 무엇입니까?