다음은 값 Int
대신 s 로 하위 문자열의 경계에 액세스 할 수 있는 확장 입니다 String.Index
.
import Foundation
extension StringProtocol {
func countableRange<SearchType: StringProtocol>(
of search: SearchType,
options: String.CompareOptions = [],
range: Range<String.Index>? = nil,
locale: Locale? = nil
) -> CountableRange<Int>? {
guard let trueRange = self.range(of: search, options: options, range: range, locale: locale) else {
return nil
}
let intStart = self.distance(from: startIndex, to: trueRange.lowerBound)
let intEnd = self.distance(from: trueRange.lowerBound, to: trueRange.upperBound) + intStart
return Range(uncheckedBounds: (lower: intStart, upper: intEnd))
}
}
이것이 기이함으로 이어질 수 있다는 점을 명심하십시오. 이것이 Apple이 그것을 어렵게 만들기로 선택한 이유입니다. (논쟁의 여지가있는 디자인 결정이긴하지만-어렵게 만들어 위험한 것을 숨기는 것 ...)
Apple 의 String 문서에서 더 많은 것을 읽을 수 있지만, tldr은 이러한 "인덱스"가 실제로 구현에 따라 다르다는 사실에서 비롯된 것입니다. 그것들은 OS에 의해 렌더링 된 후 문자열에 대한 색인을 나타내 므로 사용중인 유니 코드 사양의 버전에 따라 OS에서 OS로 이동할 수 있습니다. 즉, 문자열에서 올바른 위치를 결정하기 위해 데이터에 대해 UTF 사양을 실행해야하므로 인덱스로 값에 액세스하는 것이 더 이상 상수 시간 작업이 아닙니다. 이러한 인덱스는 NSString에 의해 생성 된 값이나 기본 UTF 스칼라에 대한 인덱스와 함께 정렬되지 않습니다. 주의 사항 개발자.